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連接方式是相同的. - 這里有一篇的很全面的參數解釋:
- 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&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);
}
}
}