記事のディレクトリ
データベース接続プール
概念
基本的なJdbcを使用して操作する場合は、SQLを実行するたびに最初にConnectionオブジェクトを申請し、実行後に解放する必要があります。これにより、パフォーマンスが低下します。したがって、プーリングテクノロジを使用すると、データベースにアクセスするたびに、接続オブジェクトが接続プールから取り出され、アクセスが完了すると、接続オブジェクトが接続プールに返されます。接続オブジェクトを再利用し、パフォーマンスのオーバーヘッドを削減するという目的を達成するため。
メリット
-
パフォーマンスを向上させるために、Connectionオブジェクトの頻繁な作成と破棄を回避します
-
接続オブジェクトの統合管理に便利
成し遂げる
- インターフェイスDataSourceはJdbc標準で定義されています。このインターフェイスは、ドライバーサプライヤによって実装され、3つの実装があります。
- 基本的な実現:標準の接続を生成できます
- 接続プールの実装:接続プールに自動的に参加する接続を生成できます
- 分散トランザクションの実装:分散トランザクションの接続を生成できます
- 接続プールを介して実装されたデータソースの場合、取得した接続は、接続を閉じるのではなく、閉じたときに接続プールに返されます。
接続プールの使用方法
- DataSourceオブジェクトを作成します
- DataSource
getConnection()
メソッドを呼び出して接続を取得します - 操作が完了したら、Connectionのcloseメソッドを呼び出して接続を返します(標準のConnectionの場合、closeメソッドを呼び出すと接続が閉じます。データベース接続プールを介して取得したConnectionの場合、closeメソッドを呼び出しても接続は閉じません。ただし、接続は返されます)
特定の接続プールテクノロジー
c3p0
使用手順
-
jarパッケージをインポートします
<!-- c3p0 --> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.5</version> </dependency>
-
構成ファイルを作成します。
デフォルトでは、c3p0はクラスパスのトップディレクトリでc3p0.propertiesファイルまたはc3p0-config.xmlファイルを検索します。
<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <!-- 可以配置多数据源,默认会加载default-config,也可以通过name来指定 --> <!-- 默认配置 --> <default-config> <!-- 连接四大参数配置 --> <!-- 对mysql8,若不指定serverTimezone,则c3p0会报错 --> <property name="jdbcUrl">jdbc:mysql:///yogurt?userSSL=false&characterEncoding=UTF-8&serverTimezone=UTC&autoReconnect=true</property> <property name="driverClass">com.mysql.cj.jdbc.Driver</property> <property name="user">root</property> <property name="password">root</property> <!-- 池参数配置 --> <property name="initialPoolSize">5</property> <property name="maxPoolSize">10</property> <property name="checkoutTimeout">3000</property> </default-config> <!-- 其他库 --> <named-config name="other-config"> <property name="jdbcUrl">jdbc:mysql://localhost:3306/other</property> <property name="driverClass">com.mysql.cj.jdbc.Driver</property> <property name="user">root</property> <property name="password">123</property> <property name="acquireIncrement">3</property> <property name="initialPoolSize">10</property> <property name="minPoolSize">2</property> <property name="maxPoolSize">10</property> </named-config> </c3p0-config>
-
コアオブジェクトCombPooledDataSourceを作成します
-
接続を取得getConnection()
コード例:
@Test public void testC3p0() throws SQLException { //会使用默认配置 DataSource dataSource = new ComboPooledDataSource(); //下面会使用other-config这一项配置 //ComboPooledDataSource dataSource = new ComboPooledDataSource("other-config"); Connection connection = dataSource.getConnection(); Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("select * from user limit 3"); while (set.next()){ String name = set.getString("name"); System.out.println(name); } statement.close(); connection.close(); } @Test public void testC3p0_2() throws SQLException { DataSource dataSource = new ComboPooledDataSource(); //配置了最大连接数是10 for (int i = 0; i < 12; i++){ Connection connection = dataSource.getConnection(); System.out.println(i + ":" + connection); if (i == 6 || i == 5){ //归还连接 //这样以来在超过10之后的2次也能获取到连接 connection.close(); } } }
ドルイド
使用手順
-
jarパッケージをインポートします
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.22</version> </dependency>
-
構成ファイル
druid.properties
druidはc3p0のように自動的にロードされないため、ファイル名は任意であり、任意のディレクトリに配置できます。druidは構成ファイルを手動でロードする必要があります。
db.url=jdbc:mysql://localhost:3306/yogurt?userSSL=false&characterEncoding=UTF-8&serverTimezone=UTC db.user=root db.password=root db.driverClass=com.mysql.cj.jdbc.Driver
-
データソースを取得するときは、ファクトリクラスDruidDataSourceFactoryを使用します
-
接続を取得
ドルイドをカプセル化し、ユーティリティを形成し、外部に提供する
- 接続方法を取得する
- リソースの解放方法
- 接続プールメソッドを取得する
public class DruidUtil {
private static DataSource dataSource;
static {
try {
Properties properties = new Properties();
properties.load(DruidUtil.class.getClassLoader().getResourceAsStream("druid.properties"));
dataSource = DruidDataSourceFactory.createDataSource(properties);
}catch (Exception e){
e.printStackTrace();
}
}
//获取连接
public static Connection getConnection() throws SQLException {
//从连接池取出一个Connection
return dataSource.getConnection();
}
//释放资源
public static void close(Statement statement,Connection connection){
close(null,statement,connection);
}
public static void close(ResultSet resultSet,Statement statement, Connection connection){
if (resultSet != null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement != null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null){
try {
//归还连接
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//返回连接池
public static DataSource getDataSource(){
return dataSource;
}
}
dbcp
少し