オープンソースのデータベース接続プール

パーツのブログは、ちょうどこのデータベース接続プールの定義は、良好な接続プールを作成することができない彼らの能力のおかげで、非常に簡単であるため、もちろん、データベース接続プールをカスタマイズする方法を終えました。心配しないで、我々はオープンソースのデータベース接続プールを使用することができます。しかし、オープンソースの利点はここに反映されます。

Javaのデータベース接続プール内の3つのオープンソースを達成するために、データの独立したソースを提供してあります。

  • DBCPデータベース接続プール
  • C3P0データベース接続プール
  • Apache Tomcatの組み込みの接続プール(ApacheのDBCP)
1、DBCPデータベース接続プール

DBCP接続プールは、Apache Software Foundationの下でオープンソースは、アプリケーションがシステムに以下の2つのJARファイルを追加する必要がありDBCPデータソースを使用して実装されます。

  • コモンズ-dbcp.jar
  • コモンズ-pool.jar

今日のjarパッケージのリソースは、私はまた、ネットワークドライブに置きます。リンクします。https://pan.baidu.com/s/1-Rj4TQLI_5DGLdfb45N62g
抽出コード:ba3aは、
このオープンBaiduのネットワークディスクの電話アプリケーション、操作がより便利にああの内容をコピー
準備のjarパッケージを、それでは、それを使ってみましょう。
新しいJavaプロジェクトを作成します。
そして、テストクラスDBCPTestを作成し、テストコードを書きます

@Test
public void demo1(){
    //首先使用BasicDataSource创建连接池
    BasicDataSource basicDataSource = new BasicDataSource();
    try {
        //从连接池中获取连接
        Connection connection = basicDataSource.getConnection();
        String sql = "select * from account";
        PreparedStatement stmt = connection.prepareStatement(sql);
        ResultSet set = stmt.executeQuery();
        while(set.next()){
            System.out.println(set.getString("name"));
        }
        //释放资源
        JDBCUtils.release(stmt, connection);
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

さて、テストコードを実行し、テーブルのデータをチェックアウトすることができますか?
どうやら、でもデータベースにパラメータを与えていない、このテストコードは確かにエラーになります。
それは今、パラメータについて設定されたテストコードを変更するには

@Test
public void demo1(){
    //首先使用BasicDataSource创建连接池
    BasicDataSource basicDataSource = new BasicDataSource();
    //创建连接需要四个参数
    basicDataSource.setDriverClassName("com.mysql.jdbc.Driver");
    basicDataSource.setUrl("jdbc:mysql:///test");
    basicDataSource.setUsername("root");
    basicDataSource.setPassword("123456");
    try {
        //从连接池中获取连接
        Connection connection = basicDataSource.getConnection();
        String sql = "select * from account";
        PreparedStatement stmt = connection.prepareStatement(sql);
        ResultSet set = stmt.executeQuery();
        while(set.next()){
            System.out.println(set.getString("name"));
        }
        //释放资源
        JDBCUtils.release(stmt, connection);
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

今、テストコードの実行
ここに画像を挿入説明
に成功したテーブルデータに問い合わせます。しかし、この書き込みは制限があり、柔軟なユーザーのニーズに対応するために、データベースパラメータの設定ファイルに記述する必要があります。
srcディレクトリにある新しいプロファイルdbcp.properties

driverClassName = com.mysql.jdbc.Driver
url = jdbc:mysql:///test
username = root
password =123456

テストコードを書きます

@Test
public void demo2() throws Exception{
    //读取dbcp.properties
    Properties properties = new Properties();
    properties.load(new FileInputStream(this.getClass().getResource("/dbcp.properties").getFile()));
    DataSource dataSource = BasicDataSourceFactory.createDataSource(properties);
    //从连接池中获取连接
    Connection connection = dataSource.getConnection();
    String sql = "select * from account";
    PreparedStatement stmt = connection.prepareStatement(sql);
    ResultSet set = stmt.executeQuery();
    while(set.next()){
        System.out.println(set.getString("name"));
    }
    //释放资源
    JDBCUtils.release(stmt, connection);
}

[実行
ここに画像を挿入説明
正常に実行。
より包括的なコンフィギュレーション・ファイルを添付します。

#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbc
username=root
password=

#<!-- 初始化连接 -->
initialSize=10

#最大连接数量
maxActive=50

#<!-- 最大空闲连接 -->
maxIdle=20

#<!-- 最小空闲连接 -->
minIdle=5

#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=60000


#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;] 
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=gbk

#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true

#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED
2、C3P0データベース接続プール

JARパッケージをダウンロード:https://sourceforge.net/projects/c3p0/
公式ウェブサイトのアドレス:https://www.mchange.com/projects/c3p0/
公式サイトのダウンロードと入口、およびチュートリアルデータベース接続プールがありました。
ドキュメントは、公式ウェブサイトは非常に詳細なので、それはですが、詳細はチュートリアル。
直接ケースに。
テストコードを書きます

@Test
public void demo1() throws Exception{
    //创建一个连接池
    ComboPooledDataSource dataSource = new ComboPooledDataSource();
    //设置四个参数
    dataSource.setDriverClass("com.mysql.jdbc.Driver");
    dataSource.setJdbcUrl("jdbc:mysql:///test");
    dataSource.setUser("root");
    dataSource.setPassword("123456");
    
    Connection connection = dataSource.getConnection();
    String sql = "select * from account";
    PreparedStatement stmt = connection.prepareStatement(sql);
    ResultSet set = stmt.executeQuery();
    while(set.next()){
        System.out.println(set.getString("name"));
    }
    JDBCUtils.release(stmt, connection);
}

あなたのjarパッケージのバージョンが二次包装、mchange-コモンズ-javaの-0.2.3.4.jarを追加する必要があるのバージョン後以降のc3p0-0.9.2、バージョンがあることを示す、タイムズClassNotFoundExecption異常を実行する場合、以下の点を注意してください 。
これは、ダウンロードアドレス瓶です。リンクします。https://pan.baidu.com/s/17o0s92Us-UPQPJFeJjpOzQ
抽出コード:lt2v
ああ操作がより便利に、このオープンBaiduのネットワークディスク電話アプリケーションの内容をコピー

同様に、コンフィギュレーション・ファイルは、それを実現しています。
srcディレクトリ新規ファイル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:///test</property>
        <property name="user">root</property>
        <property name="password">123456</property>
        
        <property name="automaticTestTable">con_test</property>
        <property name="checkoutTimeout">30000</property>
        <property name="idleConnectionTestPeriod">30</property>
        <property name="initialPoolSize">10</property>
        <property name="maxIdleTime">30</property>
        <property name="maxPoolSize">100</property>
        <property name="minPoolSize">10</property>
        <property name="maxStatements">200</property>

        <user-overrides user="test-user">
            <property name="maxPoolSize">10</property>
            <property name="minPoolSize">1</property>
            <property name="maxStatements">0</property>
        </user-overrides>

    </default-config>

    <!-- This app is massive! -->
    <named-config name="intergalactoApp">
        <property name="acquireIncrement">50</property>
        <property name="initialPoolSize">100</property>
        <property name="minPoolSize">50</property>
        <property name="maxPoolSize">1000</property>

        <!-- intergalactoApp adopts a different approach to configuring statement 
            caching -->
        <property name="maxStatements">0</property>
        <property name="maxStatementsPerConnection">5</property>

        <!-- he's important, but there's only one of him -->
        <user-overrides user="master-of-the-universe">
            <property name="acquireIncrement">1</property>
            <property name="initialPoolSize">1</property>
            <property name="minPoolSize">1</property>
            <property name="maxPoolSize">5</property>
            <property name="maxStatementsPerConnection">50</property>
        </user-overrides>
    </named-config>
</c3p0-config>

これは、公式ドキュメントダウンから直接コピーされます。その後、必要に応じて4つのデータベース設定パラメータを追加します。
そして、テストコードを書きます

@Test
public void demo2() throws Exception{
    //使用c3p0配置文件
    ComboPooledDataSource dataSource = new ComboPooledDataSource();
    Connection connection = dataSource.getConnection();
    String sql = "select * from account";
    PreparedStatement stmt = connection.prepareStatement(sql);
    ResultSet set = stmt.executeQuery();
    while(set.next()){
        System.out.println(set.getString("name"));
    }
    JDBCUtils.release(stmt, connection);
}

C3P0のデータベース接続プールを手動で設定ファイルをロードする必要はありません、注意してください、非常に人間的なC3P0、このステップは良いパッケージされています。あなたがオブジェクトを作成した後、直接接続して取得するComboPooledDataSourceのgetConnection()メソッドを呼び出します。お使いのコンフィギュレーション・ファイル名はC3P0-config.xmlのでなければならないと仮定すると、ファイルはsrcディレクトリの下に配置する必要があります。意味を持っていた文書内の他の構成情報については、あなたが自分で読むことを学ぶことができます。

そこデフォルトの設定で設定ファイルを使用したパラメータなしのコンストラクタを、オブジェクトを作成呼び出すには二つの方法がありますが、あなたは、コンストラクタを呼び出す場合は、設定ファイルをパラメータを持っているComboPooledDataSource 渡されたタグ名の属性値は、タグ内の構成情報を使用します。

3、Tomcatは、接続プールを構築しました

ある知っている必要があり、Tomcatの接続プールは、コンテンツDBCPです。
私たちは、次の3つの方法でTomcatのWebプロジェクトに展開されることを知っています:

  • server.xmlの設定、追加 タグ
  • 別のXMLファイルを設定し、追加します タグ
  • 直接TomcatのwebappsディレクトリにWebディレクトリをコピーします

Tomcatを実行することができるようにする任意のプロジェクトでは、仮想ディレクトリを必要とします。仮想ディレクトリは、何を指し?コンテキストは、要素を指します。私たちは、接続プールを使用する必要がある場合は、次の構成コンテキストを作成する必要があります

<Context path="/DBTest" docBase="DBTest"
        debug="5" reloadable="true" crossContext="true">

    <!-- maxActive: Maximum number of dB connections in pool. Make sure you
         configure your mysqld max_connections large enough to handle
         all of your db connections. Set to -1 for no limit.
         -->

    <!-- maxIdle: Maximum number of idle dB connections to retain in pool.
         Set to -1 for no limit.  See also the DBCP documentation on this
         and the minEvictableIdleTimeMillis configuration parameter.
         -->

    <!-- maxWait: Maximum time to wait for a dB connection to become available
         in ms, in this example 10 seconds. An Exception is thrown if
         this timeout is exceeded.  Set to -1 to wait indefinitely.
         -->

    <!-- username and password: MySQL dB username and password for dB connections  -->

    <!-- driverClassName: Class name for the old mm.mysql JDBC driver is
         org.gjt.mm.mysql.Driver - we recommend using Connector/J though.
         Class name for the official MySQL Connector/J driver is com.mysql.jdbc.Driver.
         -->
    
    <!-- url: The JDBC connection url for connecting to your MySQL dB.
         -->

  <Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
               maxActive="100" maxIdle="30" maxWait="10000"
               username="javauser" password="javadude" driverClassName="com.mysql.jdbc.Driver"
               url="jdbc:mysql://localhost:3306/javatest"/>

</Context>

これは、公式サイトからダウンコピーされました。
それを次に、コンテキストコンフィギュレーションの要素?
コンテキスト要素は三つの位置に配置されました:

  • Tomcatのインストールディレクトリの/conf/context.xml(あなたがプールコンフィギュレーションファイルに接続する場合は、その意志任意の現在のプロジェクトのすべての内部のTomcat仮想ホストに対して有効)
  • Tomcatのインストールディレクトリ/ confに/カタリナ/仮想ホストディレクトリ/context.xml(あなたがプールコンフィギュレーションファイルに接続する場合、それは任意の現在の仮想ホスト上の作品が有効であるだろう)
  • Webプロジェクトの/META-INF/context.xmlのルート(あなたがプールコンフィギュレーションファイルに接続した場合にのみ、現在のプロジェクトのために有効になります)

第三の構成について、次のプレゼンテーション
フォルダ内のMETA-INFファイルウェブルートは、新しいファイルのcontext.xmlを作成します

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/DBTest" docBase="DBTest" debug="5" reloadable="true"
    crossContext="true">

    <Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
        maxActive="100" maxIdle="30" maxWait="10000" username="root"
        password="123456" driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/test" />

</Context>

context.xmlファイルの書き込みが完了した後、Tomcatサーバーを起動し、Tomcatは自動的に行って、ファイルをロードして、Tomcatコンテナにあるデータベース接続プールを作成します。この時点では、データベース接続プールにアクセスするためのJNDIテクノロジを使用することができます。
JNDI子供用の靴は、技術を理解していない、我々はここで少し言及することができます

JNDI(Javaのネーミングおよびディレクトリインタフェース) 、Java(登録商標) J2SEのjavax.namingパッケージに対応するネーミングとディレクトリインタフェースは、
容器内に配置することができるJavaオブジェクト(コンテナサポートJNDIのTomcat):主な効果は、このAPIでありますプログラムは、Javaオブジェクトを取得したい後とコンテナJavaオブジェクトの名前は、ちょうど通じ名称で検索します。
コアAPIは、JNDIコンテナオブジェクト検索方法ルックアップ名対応するコンテナを表すコンテキストです。

注意:
TomcatはTomcatのディレクトリのフォルダの下のlib mysql.jarにファイルをコピーし、接続プール、データベースに接続するためのデータベース駆動型の必要性を作成します。
Javaプログラムは、JNDI経由オブジェクトにアクセスするためには、同じJNDIコンテナで実行する必要があります。これは、JavaプログラムはとてもJNDIプログラム一般サーブレットやJSPを使用して、Tomcatの内部で実行する必要があります。

示しています。
新しいプロジェクトファイルでTomcatServletサーブレットです

/**
 * 在该程序中,通过JNDI访问Tomcat内部的连接池
 * @author Administrator
 *
 */
public class TomcatServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            //创建一个检索的对象
            Context initCtx = new InitialContext();
            //默认查找顶级的Java名称串    这是固定的:java:comp/env
            Context envCtx = (Context) initCtx.lookup("java:comp/env");
            //根据设置名称查找连接池对象
            DataSource ds = (DataSource) envCtx.lookup("jdbc/TestDB");
            //获得连接池中的一个连接
            Connection conn = ds.getConnection();
            String sql = "select * from account";
            PreparedStatement stmt = conn.prepareStatement(sql);
            ResultSet set = stmt.executeQuery();
            while(set.next()){
                System.out.println(set.getString("name"));
            }
            JDBCUtils.release(stmt, conn);
        } catch (NamingException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

、データベース駆動型に忘れるのmysql-コネクタのjava-5.1.47-コピーしないでください bin.jarをファイルフォルダのTomcatのlibディレクトリにインストールすると、その後、MyEclipseの展開プロジェクトで実行されます。次に、ブラウザでサーブレットプログラムを訪問し
ここに画像を挿入説明
、クエリが成功した説明書。

おすすめ

転載: www.cnblogs.com/blizzawang/p/11411383.html