【轉】Java最全的數據源配置

Javaweb配置最全的數據源配置

DBCP

  • DBCP是Apache推出的數據庫連接池(Database Connection Pool)。
    操作步驟:

  • 添加jar包:
    commons-dbcp-1.4.jar
    commons-pool-1.5.6.jar

  • 添加屬性資源文件
    dbcpconfig.properties文件。

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db_user
username=root
password=root
initialSize=10
maxActive=50
maxIdle=20
minIdle=5
maxWait=60000
connectionProperties=useUnicode=true;characterEncoding=utf8
defaultAutoCommit=true
defaultReadOnly=
defaultTransactionIsolation=REPEATABLE_READ
  • 編寫數據源工具類
public class DBUtil {
    public static Connection getConnection(){
        Connection conn = null;

        try {
            conn = getDataSource().getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return conn;
    }

    private static DataSource getDataSource(){
        DataSource dataSource=null;
        Properties p = new Properties();
        try {
            p.load(DBUtil.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"));
            dataSource = BasicDataSourceFactory.createDataSource(p);
        } catch (Exception e) {
            throw new RuntimeException("獲取DataSource對象失敗");
        } 
        return dataSource;
    }
}

C3P0

  • 操作步驟:

  • 添加jar包
    c3p0-0.9.1.2.jar

  • 編寫配置文件
    創建一個c3p0-config.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
  <default-config>
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/db_user</property>
    <property name="user">root</property>
    <property name="password">root</property>
    <property name="initialPoolSize">10</property>
    <property name="maxIdleTime">30</property>
    <property name="maxPoolSize">100</property>
    <property name="minPoolSize">10</property>
  </default-config>
</c3p0-config>
  • 編寫數據源工具類
public class DBUtil {
    private static DataSource dataSource = new ComboPooledDataSource();
    public static Connection getConnection(){
        Connection conn = null;
        try {
            conn = dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }
}

JavaWeb之Tomcat管理數據源

上面2中方式都需要導入jar包,在JavaWeb服務器Tomcat中其實內置了數據源。所以不需要導入jar包。

Tomcat內置數據源其實也是DBCP,是Tomcat的lib目錄下的tomcat-dbcp.jar。

配置數據源的步驟:

  • 拷貝數據庫連接的jar mysql-connector-java-5.1.7-bin.jar到tomcat/lib目錄下

  • 配置數據源XML文件

<Context>
     <Resource name="jdbc/login_register" auth="Container" type="javax.sql.DataSource"
           maxActive="100" maxIdle="30" maxWait="10000"
           username="root" password="root" driverClassName="com.mysql.jdbc.Driver"
           url="jdbc:mysql://localhost:3306/db_user"/>
</Context>
  • 如果是在當前應用的META-INF中創建context.xml,編寫數據源,那麼只有當前應用可以使用。

  • 使用連接池,封裝工具類

public class DBUtil {
    public static Connection getConnection(){
        Connection conn = null;
        try {
            Context c = new InitialContext();
            DataSource dataSource = (DataSource) c.lookup("java:/comp/env/jdbc/login_register");//這裏的jdbc/login_register和篇配置文件中的name屬性一致
            conn = dataSource.getConnection();
            return conn;
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (NamingException e) {
            e.printStackTrace();
        }

        return conn;
    }
}

BoneCP

  • bonecp 號稱比c3p0 dbcp 性能快25倍,主要是因爲 bonecp採用了1.5引入的並行包,拋棄了鎖機制

  • (官方主頁)[http://jolbox.com/index.html?- - - page=http://jolbox.com/download.html]

  • 這裏提供的maven的依賴 ,另爲例子用了單機數據庫hsqldb ,所以還需要你導入這個包,不過你可以
    用本機的任意一款驅動嘗試鏈接,方式與原始的jdbc連接方式是相同的.

  • 這裏有一篇的很全面的參數解釋:
    (鏈接)[http://chirs1012f.iteye.com/blog/805261]

  • maven 依賴

<dependency>
            <groupId>com.jolbox</groupId>
            <artifactId>bonecp</artifactId>
            <version>0.6.5</version>
            <scope>compile</scope>
        </dependency>
    <!-- This is the HSQLDB database in use by this test. Replace with MySQL, PostgreSQL etc here if you wish. -->
        <dependency>
            <groupId>hsqldb</groupId>
            <artifactId>hsqldb</artifactId>
            <version>1.8.0.10</version>
            <scope>compile</scope>
        </dependency>
  • jdbc基本代碼
public class ExampleJDBC {

   /** Start test
    * @param args none expected.
    */
   public static void main(String[] args) {
       BoneCP connectionPool = null;
       Connection connection = null;

       try {
           // load the database driver (make sure this is in your classpath!)
           //替換爲mysql等驅動
           Class.forName("org.hsqldb.jdbcDriver");
       } catch (Exception e) {
           e.printStackTrace();
           return;
       }
       
       try {

           // setup the connection pool
           BoneCPConfig config = new BoneCPConfig();
           //鏈接的地址
           config.setJdbcUrl("jdbc:hsqldb:mem:test"); // jdbc url specific to your database, eg jdbc:mysql://127.0.0.1/yourdb
           config.setUsername("sa"); 
           config.setPassword("");
           config.setMinConnectionsPerPartition(5);
           config.setMaxConnectionsPerPartition(10);
           config.setPartitionCount(1);
           connectionPool = new BoneCP(config); // setup the connection pool
           
           connection = connectionPool.getConnection(); // fetch a connection
           
           if (connection != null){
               System.out.println("Connection successful!");
               Statement stmt = connection.createStatement();
               ResultSet rs = stmt.executeQuery("SELECT 1 FROM INFORMATION_SCHEMA.SYSTEM_USERS"); // do something with the connection.
               while(rs.next()){
                   System.out.println(rs.getString(1)); // should print out "1"'
               }
           }
           connectionPool.shutdown(); // shutdown connection pool.
       } catch (SQLException e) {
           e.printStackTrace();
       } finally {
           if (connection != null) {
               try {
                   connection.close();
               } catch (SQLException e) {
                   e.printStackTrace();
               }
           }
       }
   }
}
  • 由於現在流行使用ssm 技術 所以提供spring,其他去官方查
<!-- BoneCP configuration -->
<bean id="mainDataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">
   <property name="driverClass" value="com.mysql.jdbc.Driver" />
   <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1/yourdb" />
   <property name="username" value="root"/>
   <property name="password" value="abcdefgh"/>
   <property name="idleConnectionTestPeriod" value="60"/>
   <property name="idleMaxAge" value="240"/>
   <property name="maxConnectionsPerPartition" value="30"/>
   <property name="minConnectionsPerPartition" value="10"/>
   <property name="partitionCount" value="3"/>
   <property name="acquireIncrement" value="5"/>
   <property name="statementsCacheSize" value="100"/>
   <property name="releaseHelperThreads" value="3"/>
</bean>


@Component
public class Foo {
 
@Autowired
DataSource ds;
 
 public void testBoneCP() throws SQLException {
    Connection connection = ds.getConnection();
    System.out.println(connection); // do something with the connection here..
 }
 
}

HikariCP

  • 技術總是在進步的,大致意思是ps:紅色框中的部分意思:雖然BoneCP性能優於老舊的C3PO和DBCP連接池,但是現在應該被捨棄了,以迎接HikariCP
    作者詞語之間充滿了悲涼之感,好比當年的少年俠客,風流倜儻,如今已是遲暮之年,不得不退出江湖,何其悲涼。
    在筆者胡亂感傷一通過後,那麼問題就來了。

  • Github主頁:(主頁)[http://brettwooldridge.github.io/HikariCP/]
      HikariCP是一個高效的數據庫連接池。

  • 詳細的其他方式 請訪問 (官方)[https://github.com/brettwooldridge/HikariCP/wiki]

  • 限於篇章,下面介紹快速的使用方法

  • 下面spring 配置

<!-- HikariCP 高性能數據庫連接池 -->
    <bean id="dataSourceHikari" class="com.zaxxer.hikari.HikariDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/black1?useUnicode=true&amp;characterEncoding=UTF-8"/>
        <property name="username" value="root"/>
        <property name="password" value=""/>
        <!-- Default settings -->
        <!-- 控制自動提交行爲 default:true -->
        <property name="autoCommit" value="true"/>
        <!--連接池獲取的連接是否只讀 default:false-->
        <property name="readOnly" value="false"/>
        <!--控制連接的事務隔離等級 default:none-->
        <property name="transactionIsolation" value="none"/>
        <!--設置catalog以便於支持查看catalogs , 若不指定的話將直接使用 JDBC driver使用的 default:none-->
        <property name="catalog" value="none"/>
        <!--最大連接超時時間 default:30秒-->
        <property name="connectionTimeout" value="30000"/>
        <!--最大空閒超時時間 default:10分鐘   -->
        <property name="idleTimeout" value="600000"/>
        <!--連接池中一個連接的最大生命週期 default:30分鐘-->
        <property name="maxLifetime" value="1800000 "/>
        <!--  ...還有一些其他配置屬性 有興趣可以看看 O(∩_∩)O哈哈~ -->
    </bean>
  • spring4 的無xml 配置方式
@Configuration
@EnableTransactionManagement
public class AppConfig {
    @Bean
    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setHibernateProperties(hibernateProperties());
        return sessionFactory;
    }

    @Bean
    public HibernateTransactionManager transactionManager() {
        HibernateTransactionManager txManager = new HibernateTransactionManager();
        txManager.setSessionFactory(sessionFactory().getObject());
        return txManager;
    }

    private DataSource dataSource() {
        final HikariDataSource ds = new HikariDataSource();
        ds.setMaximumPoolSize(100);
        ds.setDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlDataSource");
        ds.addDataSourceProperty("url", url);
        ds.addDataSourceProperty("user", username);
        ds.addDataSourceProperty("password", password);
        ds.addDataSourceProperty("cachePrepStmts", true);
        ds.addDataSourceProperty("prepStmtCacheSize", 250);
        ds.addDataSourceProperty("prepStmtCacheSqlLimit", 2048);
        ds.addDataSourceProperty("useServerPrepStmts", true);
        return ds;
    }

    private Properties hibernateProperties() {     
        final Properties properties = new Properties();
       // (Dialect, 2nd level entity cache, query cache, etc.)
        return properties;
    }
 
}
  • Tomcat 數據源配置
<Resource name="jdbc/OracleHikari" auth="Container"
      factory="com.zaxxer.hikari.HikariJNDIFactory"
      type="javax.sql.DataSource"
      minimumIdle="5" 
      maximumPoolSize="10"
      connectionTimeout="300000"
      dataSourceClassName="oracle.jdbc.pool.OracleDataSource"
      dataSource.implicitCachingEnabled="true" 
      dataSource.user="user"
      dataSource.password="pwd"
      dataSource.url="jdbc:oracle:thin:@orcl_server:1521:orcl"/>

阿里druid

  • 爲監控而生的數據庫連接池!阿里雲DRDS(https://www.aliyun.com/product/drds )、阿里巴巴TDDL 連接池powered by Druid https://github.com/alibaba/druid/wiki Druid號稱是Java語言中最好的數據庫連接池。Druid能夠提供強大的監控和擴展功能。
  • 屬性文件:application.properties(DataSource連接參數)
jdbc.driverClassName=com.mysql.jdbc.Driver 
jdbc.url=jdbc:mysql://127.0.0.1:3306/test 
jdbc.username=root 
jdbc.password=1qaz!QAZ
spring 配置文件
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" 
  init-method="init" destroy-method="close"> 
  <property name="driverClassName" value="${jdbc.driverClassName}" /> 
  <property name="url" value="${jdbc.url}" /> 
  <property name="username" value="${jdbc.username}" /> 
  <property name="password" value="${jdbc.password}" /> 
  <!-- 配置初始化大小、最小、最大 --> 
  <property name="initialSize" value="1" /> 
  <property name="minIdle" value="1" /> 
  <property name="maxActive" value="10" />

  <!-- 配置獲取連接等待超時的時間 --> 
  <property name="maxWait" value="10000" />

  <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連接,單位是毫秒 --> 
  <property name="timeBetweenEvictionRunsMillis" value="60000" />

  <!-- 配置一個連接在池中最小生存的時間,單位是毫秒 --> 
  <property name="minEvictableIdleTimeMillis" value="300000" />

  <property name="testWhileIdle" value="true" />

  <!-- 這裏建議配置爲TRUE,防止取到的連接不可用 --> 
  <property name="testOnBorrow" value="true" /> 
  <property name="testOnReturn" value="false" />

  <!-- 打開PSCache,並且指定每個連接上PSCache的大小 --> 
  <property name="poolPreparedStatements" value="true" /> 
  <property name="maxPoolPreparedStatementPerConnectionSize" 
   value="20" />

  <!-- 這裏配置提交方式,默認就是TRUE,可以不用配置 -->

  <property name="defaultAutoCommit" value="true" />

  <!-- 驗證連接有效與否的SQL,不同的數據配置不同 --> 
  <property name="validationQuery" value="select 1 " /> 
  <property name="filters" value="stat" /> 
  <property name="proxyFilters"> 
   <list> 
    <ref bean="logFilter" /> 
   </list> 
  </property> 
 </bean>

測試類

public class TestMain {

 public static void loadLoggerContext() { 
  System.getProperties().put("logback.configurationFile", "./conf/logback.xml"); 
  LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); 
  StatusPrinter.setPrintStream(System.err); 
  StatusPrinter.print(lc); 
 }

 public static void main(String[] args) { 
  try { 
   loadLoggerContext(); 
   FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("./conf/spring-base.xml"); 

  } catch (Exception e) { 
   System.out.println(e); 
  } 
 } 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章