zoukankan      html  css  js  c++  java
  • [转] 数据库链接池配置

    转自:http://blog.163.com/try_boy/blog/static/1786865622012128111537267/

    今天遇到了关于数据源连接池配置的问题,发现有很多种方式可以配置,现总结如下,希望对大家有所帮助:(已Mysql数据库为例)

    一,Tomcat配置数据源:

    方式一:在WebRoot下面建文件夹META-INF,里面建一个文件context.xml,内容如下:
    <Context>
         <Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource"
         maxActive="50" maxIdle="30" maxWait="10000" logAbandoned="true"
         username="root" password="111111" driverClassName="com.mysql.jdbc.Driver" 
         url="jdbc:mysql://localhost:3306/testdb" />
    </Context>

    方式二:在tomcat6.0的目录conf下面的context.xml中,修改原来的context标签,改成内容如下:
    <Context>

        <!-- Default set of monitored resources -->
        <WatchedResource>WEB-INF/web.xml</WatchedResource>

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

    </Context>

    方式三:在配置虚拟目录时,也就是在配置conf下面的server.xml时,在context标签内改成如下形式:
    <Context path="/WebRoot" reloadable="true" docBase="E:workspaceDataSourceWebRoot" >
        <Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource"
        maxActive="50" maxIdle="30" maxWait="10000" logAbandoned="true"
        username="root" password="111111" driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/testdb" />
    </Context>

    配置文件中Resource标签中各属性的含义:

    driverClassName - JDBC 所用到的数据库驱动的类全名.

    maxActive - 连接池在同一时刻内所提供的最大活动连接数。

    maxIdle - 连接池在空闲时刻保持的最大连接数.

    maxWait - 当发生异常时数据库等待的最大毫秒数 (当没有可用的连接时).

    password - 连接数据库的密码.

    url - 连接至驱动的URL. (为了向后兼容, DRIVERNAME也被允许.)

    user - 数据库用户名.

    各种配置方式的范围也应该是不一样的。我在这就不细说了,总之就是在Context标签下面配置个Resource标签即可。

    测试代码:
    Context initContext = new InitialContext();
    Context envContext = (Context)initContext.lookup("java:/comp/env");
    DataSource ds = (DataSource)envContext.lookup("jdbc/test");
    System.out.println(ds.getConnection());
    打印出来不是null应该就成功了。
    注意,测试的时候要在tomcat内测试,也就是要在TOMCAT这个容器内(不要闲麻烦,写个简单的JSP页面测下,用个<%...%>就可以了,相当简单的)。不在tomcat这个容器里面测,会抛异常:

    ... javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial

    二,Hibernate配置连接池有三种方法:

    方式1 使用Hibernate自带的连接池。

    <hibernate-configuration>
    <session-factory >
    <!--JDBC驱动程序-->
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <!-- 连接数据库的URL-->
    <property name="connection.url">
    jdbc:mysql://localhost:3306/feifei
    </property>
    <!--连接的登录名-->
    <property name="connection.username">root</property>
    <!--登录密码-->
    <property name="connection.password"></property>
    <!--是否将运行期生成的SQL输出到日志以供调试-->
    <property name="show_sql">true</property>
    <!--指定连接的语言-->
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    <!--映射资源-->
    <mapping resource="/xx/xx.hbm.xml" />
    </session-factory>
    </hibernate-configuration>
    我自己的配置如下,注释的部分,他是公用的,其它的连接池需要用到!
    <hibernate-configuration>
    <session-factory>
    <property name="show_sql">true</property>
    <!-- common conf dbcp/c3p0 needed
    <property name="connection.username">informix</property>
    <property name="connection.password">informix</property>
    <property name="connection.driver_class">com.informix.jdbc.IfxDriver</property>
    <property name="connection.url">
    jdbc:informix-sqli://192.168.0.188:1526/db_crm:informixserver=ol_sx;NEWLOCALE=zh_cn,en_us;NEWCODESET=gbk,8859_1,819;
    </property>
    <property name="dialect">
    com.huatech.sysframe.webapp.common.dao.hibernate.dialet.BaseInformixDialect
    </property>
    -->
    ... ... ... ...
    </session-factory>
    </hibernate-configuration>

    =================================================================================
    方式2: 使用配置文件指定的数据库连接池。
    连接池现在有dbcp、c3p0、proxoop,其实我原来就知道dbcp
    其中dbcp、c3p0的配置只需要在 上面 的配置上加入些配置就行,hibernate会自动识别数据库连接池

    配置dbcp需要加入:
    <!-- dbcp conf
    <property name="dbcp.maxActive">100</property>
    <property name="dbcp.whenExhaustedAction">1</property>
    <property name="dbcp.maxWait">60000</property>
    <property name="dbcp.maxIdle">10</property>

    <property name="dbcp.ps.maxActive">100</property>
    <property name="dbcp.ps.whenExhaustedAction">1</property>
    <property name="dbcp.ps.maxWait">60000</property>
    <property name="dbcp.ps.maxIdle">10</property>
    -->
    配置c3p0需要加入:
    <!-- c3p0 conf
    <property name="c3p0.min_size">5</property>
    <property name="c3p0.max_size">30</property>
    <property name="c3p0.time_out">1800</property>
    <property name="c3p0.max_statement">50</property>
    -->

    配置proxoop有些不同,不能仅仅加入,还需要改动:
    基本配置如下:
    <property name="proxool.pool_alias">dbpool</property>
    <property name="proxool.xml">test/huatech/conf/ProxoolConf.xml</property>
    <property name="connection.provider_class">org.hibernate.connection.ProxoolConnectionProvider</property>

    特别注意:下面文件的路径要配置正确,否则FileNotFound
    关联文件:test/huatech/conf/ProxoolConf.xml配置如下:

    <?xml version="1.0" encoding="utf-8"?>
    <something-else-entirely>
    <proxool>
    <alias>dbpool</alias>
    <!--proxool只能管理由自己产生的连接-->
    <driver-url>
    jdbc:informix-sqli://192.168.0.188:1526/db_crm:informixserver=ol_sx;NEWLOCALE=zh_cn,en_us;NEWCODESET=gbk,8859_1,819;
    </driver-url>
    <driver-class>com.informix.jdbc.IfxDriver</driver-class>
    <driver-properties>
    <property name="user" value="informix" />
    <property name="password" value="informix" />
    </driver-properties>
    <!-- proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁-->
    <house-keeping-sleep-time>90000</house-keeping-sleep-time>
    <!-- 指因未有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的用户连接就不会被接受-->
    <maximum-new-connections>20</maximum-new-connections>
    <!-- 最少保持的空闲连接数-->
    <prototype-count>5</prototype-count>
    <!-- 允许最大连接数,超过了这个连接,再有请求时,就排在队列中等候,最大的等待请求数由maximum-new-connections决定-->
    <maximum-connection-count>100</maximum-connection-count>
    <!-- 最小连接数-->
    <minimum-connection-count>10</minimum-connection-count>
    </proxool>
    </something-else-entirely>

    =================================================================================

    方式3: 从容器中获取得到连接池(如:Tomcat)
    用服务器本身的连接池:如Tomcat、resin、weblogic等
    hibernate配置如下:
    <!--
    <property name="hibernate.connection.datasource">
    java:comp/env/jdbc/crm
    </property>
    <property name="show_sql">true</property>
    <property name="dialect">
    com.huatech.sysframe.webapp.common.dao.hibernate.dialet.BaseInformixDialect
    </property>
    <property name="hibernate.generate_statistics">true</property>
    -->
    其中java:comp/env/jdbc/crm的jdbc/crm是对应的服务器中数据库连接池名字,需要在对应的环境中配置

    Tomcat配置如第一种Tomcat配置方式所描述,注意jndi的name根据情况修改,要与hibernate所使用的名字对应起来。

    =================================================================================
    上面配置中需要用到各自数据库连接池的jar包,在hibernate包中有,如果需要最新的可以到各自网站下载。

    三,Spring配置连接池的方法:

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName">
        <value>com.mysql.jdbc.Driver</value>
    </property>
    <property name="url">
        <value>jdbc:mysql://localhost:3306/dbname</value>
    </property>
    <property name="username">
         <value>root</value>
    </property>
    <property name="password">
         <value>******</value>
    </property>
    <property name="maxActive">  

         <value>100</value>
    </property>
    <property name="maxWait">

         <value>1000</value>
    </property>
    <property name="maxIdle">
         <value>30</value>
    </property>

    <property name="defaultAutoCommit">
         <value>true</value>  
    </property>
    <property name="removeAbandoned"> //自动回收连接池,避免连接池泄露
         <value>true</value>
    </property>
    <property name="removeAbandonedTimeout">
         <value>60</value>
    </property>

    </bean>

    四,也是我今天要说的最后一种,则是通过代码的编写配置连接池,代码如下:

    import java.sql.*;

    import java.sql.DataSource;

    import org.apache.commons.dbcp.BasicDataSource;

    public class ConnectionPool{

        private static BasicDataSource dbs = null;

        public static DataSource setupDataSource(){

            bds = new BasicDataSource();

            //设置驱动程序

            bds.sestDriverClassName("com.mysql.jdbc.Driver");

            //设置连接用户名

            bds.setUsername("root");

            //设置连接密码

            bds.setPassword("root");

            //设置连接地址

            bds.setUrl("jdbc:mysql://localhost:3306/databasename");

            //设置初始化连接总数

            bds.setInitialSize(50);

            //设置同时应用的连接总数

            bds.setMaxActive(-1);

            //设置在缓冲池的最大连接数

            bds.setMaxIdle(-1);

            //设置在缓冲池的最小连接数

            bds.setMinIdle(0);

            //设置最长的等待时间

            bds.setMaxWait(-1);

            return (DataSource)bds;

        }

        //显示连接池的连接个数的方法

        public static void printDataSourceStats(DataSource ds) throws SQLException{

            bds = (BasicDataSource)ds;

            System.out.println();

            System.out.println();

        }

         //关闭连接池的方法

         public static void shutdownDataSource(DataSource ds) throws SQLException{

             bds = (BasicDataSource)ds;

             bds.close();

         }

    }

  • 相关阅读:
    阿里P8架构师谈:阿里双11秒杀系统如何设计?
    秒杀系统设计的知识点
    秒杀系统架构优化思路
    秒杀系统解决方案
    Entity Framework Code First (七)空间数据类型 Spatial Data Types
    Entity Framework Code First (六)存储过程
    Entity Framework Code First (五)Fluent API
    Entity Framework Code First (四)Fluent API
    Entity Framework Code First (三)Data Annotations
    Entity Framework Code First (二)Custom Conventions
  • 原文地址:https://www.cnblogs.com/jianglong-liang/p/4626876.html
Copyright © 2011-2022 走看看