java访问数据库方式_java数据库访问(二)—JDBC方式(配合连接池)
上文記錄了最基礎的JDBC連接數據庫的方法,但能看出一個問題,就是要不斷的重復去創建connection和關閉connection,如果在對數據庫的訪問比較頻繁的情況下,這種處理方式方式在性能方面是不合適的,下面使用JDBC配合數據庫連接池來訪問數據庫。
除了mysql的驅動,還需引入數據庫連接池,本次選用的是dbcp2(類似的還有c3p0、阿里的druid),其實數據庫連接池的原理都類似,了解一個,上手其他的就非常容易。
引入依賴:
org.apache.commons
commons-dbcp2
2.5.0
本次要查詢的數據:
查詢service代碼:
packagecom.test.database;importjava.sql.Connection;importjava.sql.ResultSet;importjava.sql.Statement;importjavax.annotation.PostConstruct;importorg.apache.commons.dbcp2.BasicDataSource;importorg.springframework.stereotype.Service;
@Servicepublic classJdbcPooledService {
Connection connection;
BasicDataSource basicDataSource= newBasicDataSource();
@PostConstruct //用于進行初始化操作,此處初始化連接池public voidinitPool() {
System.out.println("PostConstruct init.....");
basicDataSource.setDriverClassName("com.mysql.jdbc.Driver");
basicDataSource.setUsername("root");
basicDataSource.setPassword("root");
basicDataSource.setUrl("jdbc:mysql://localhost:3306/test");
}public void testJdbc() throwsException {
System.out.println(basicDataSource.getNumActive());
connection=basicDataSource.getConnection();
Statement statement=connection.createStatement();
String sql= "select * from user";
ResultSet resultSet=statement.executeQuery(sql);while(resultSet.next()) {
System.out.println(resultSet.getString("name"));
}
resultSet.close();
statement.close();
connection.close(); //連接池的連接同樣需要調用close方法,但此時的close不是關閉連接,而是將連接還回連接池
}
}
測試類:
packagecom.test;importorg.springframework.beans.BeansException;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;importcom.test.database.JdbcPooledService;public classMain {public static void main(String[] args) throwsBeansException, Exception {
ApplicationContext context= new ClassPathXmlApplicationContext("spring-context.xml");
context.getBean(TestService.class).test();//context.getBean(JdbcService.class).testJdbc();
for (int i = 0; i < 10; i++) {
System.out.println(i);
context.getBean(JdbcPooledService.class).testJdbc();
}
}
}
打印輸出為:
PostConstruct init.....
test service
0
0
tim
1
0
tim
2
0
tim
3
0
tim
4
0
tim
5
0
tim
6
0
tim
7
0
tim
8
0
tim
9
0
tim
若在調用結束時不關閉(將連接還回連接池)connection:
packagecom.test.database;importjava.sql.Connection;importjava.sql.ResultSet;importjava.sql.Statement;importjavax.annotation.PostConstruct;importorg.apache.commons.dbcp2.BasicDataSource;importorg.springframework.stereotype.Service;
@Servicepublic classJdbcPooledService {
Connection connection;
BasicDataSource basicDataSource= newBasicDataSource();
@PostConstruct//用于進行初始化操作,此處初始化連接池
public voidinitPool() {
System.out.println("PostConstruct init.....");
basicDataSource.setDriverClassName("com.mysql.jdbc.Driver");
basicDataSource.setUsername("root");
basicDataSource.setPassword("root");
basicDataSource.setUrl("jdbc:mysql://localhost:3306/test");
}public void testJdbc() throwsException {
System.out.println(basicDataSource.getNumActive());
connection=basicDataSource.getConnection();
Statement statement=connection.createStatement();
String sql= "select * from user";
ResultSet resultSet=statement.executeQuery(sql);while(resultSet.next()) {
System.out.println(resultSet.getString("name"));
}
resultSet.close();
statement.close();//connection.close();
}
}
繼續調用測試類,結果為:
PostConstruct init.....
test service
0
0
tim
1
1
tim
2
2
tim
3
3
tim
4
4
tim
5
5
tim
6
6
tim
7
7
tim
8
8
現象是建立了8個連接就不再建立了,原因是沒有調用connection的close方法,而dbcp2的默認最大連接數是8,所以已經到了最大連接數,注意在使用連接池獲取連接時,務必關閉連接。
默認最大連接數:
public static final int DEFAULT_MAX_TOTAL = 8;
連接池獲取的連接調用close方法的源碼最終調用為:
方法聲明:
public synchronized void close() throws SQLException
關鍵調用:
pool.returnObject(this);
將此連接還回到連接池。
總結
以上是生活随笔為你收集整理的java访问数据库方式_java数据库访问(二)—JDBC方式(配合连接池)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: celery异步执行任务在Django中
- 下一篇: 深入研究Python 世界的规则,我的薪