关于数据源
将连接的指向改了,现在指向的是数据源 而不是数据库。
访问流程
数据库访问核心 -> pstmt/stmt ->connection ->1.直接数据库 2.数据源 ds.getConnection()
①Tomcat-dbcp
关于JNDI:java命名与目录接口(Java Naming and Directory Interface)
我的理解:将一个资源以key的方式存入,运行时可以根据key取
具体定义:https://baike.baidu.com/item/JNDI/3792442?fr=aladdin
对于Tomcat配置方式
tomcat/conf/context.xml配置:
<Environment name="jndiName" value="jndiValue" type="java.lang.String" />
jsp中用那值 :
必要前缀 :java:comp/env/
<%@ page import="javax.naming.InitialContext" %>
<%
Context ctx = new InitialContext() ;
String testJndi = (String)ctx.lookup("java:comp/env/jndiName");
out.print(testJndi);
%>
连接池
1、tomcat/conf/context.xml中加入以下(具体情况自行配置)
<Resource name="mydbcp" auth="Container" type="javax.sql.DataSource"
maxActive="400"
maxIdle="20" maxWait="5000" username="scott" password="tiger"
driverClassName="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@127.0.0.1:1521:ORCL" />
相关 基本参数
其中的name属性是数据源名称,通常采取jdbc/**.
type属性是数据源方式。
driverClassName属性是驱动程序名称。(上文为Oracle信息)
username,password,数据库名称和密码
url:访问的数据库路径。其中url的内容组成解析上篇博客中已经分析——Oracle安装以及测试Oracle数据库
maxActive属性是并发连接的最大数。设置为0则无限制。
maxWait属性是等待连接的最大连接的时间。
maxIdle属性是连接池中空闲的连接的个数。
上文中的设置的 maxActive="400"说明可以最大连接的个数为400个,再建立连接,则出现异常。
而maxIdle="20"说明当关闭数据库时(不是真正的断开连接,而是归还连接池中)连接池中最大可以有空闲的连接数为20个。
若是再有建立连接,此时若连接池中没有空闲的连接,但是又没有达到maxActive并发的最大连接数,则在连接池中建立连接。
2、在web.xml中加入申明
<resource-ref>
<res-ref-name>mydbcp</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
3、通过Java代码拿到数据源
传统方式
connection = DriverManager.getConnection(URL,USERNAME,PASSWORD);
通过连接池过得数据库连接池
Context ctx = new InitialContext() ;//context.xml
DataSource ds = (DataSource)ctx.lookup("java:comp/env/mydbcp") ;
connection = ds.getConnection();
②commons-dbcp
1、jar : commons-dbcp-1.4.jar、commons-pool.jar
2、获得数据源
相关参数配置方式一: 硬编码
BasicDataSource dbcp = new BasicDataSource(); //dbcp数据源的基类
dbcp.setDriverClassName("oracle.jdbc.driver.OracleDriver");
dbcp.setUrl("jdbc:oracle:thin:@127.0.0.1:1521:ORCL");
dbcp.setUsername("scott");
dbcp.setPassword("tiger");
dbcp.setInitialSize(20);
dbcp.setMaxActive(10);
return dbcp ;
相关参数配置方式一: 配置文件 dbcpconfig.properties(k-v的形式)
DataSource dbcp = null ;
//加载配置文件
Properties props = new Properties();
InputStream input = new DBCPDemo().getClass().getClassLoader().getResourceAsStream("dbcpconfig.properties");
props.load( input );
dbcp = BasicDataSourceFactory.createDataSource(props ) ; //核心语句
return dbcp;
返回值均为 javax.sql.DataSource : DataSource 是所有 sql 数据源的上级类
dbcp基础参数
initialSize: 初始化连接
maxIdle: 最大空闲连接
minIdle: 最小空闲连接
maxActive: 最大连接数量
removeAbandoned: 是否自动回收超时连接
removeAbandonedTimeout: 超时时间(以秒数为单位)
maxWait: 超时等待时间以毫秒为单位
timeBetweenEvictionRunsMillis:在空闲连接回收器执行周期(毫秒)
numTestsPerEvictionRun 在每次空闲连接回收器线程(如果有)运行时检查的连接数量
minEvictableIdleTimeMillis:最小空闲时间
validationQuery:验证链接是否有效的sql语句
testOnBorrow:获取链接之前是否测试链接的可用性
③c3p0
1、jar
c3p0.jar
如果是Oracle数据库则 添加:c3p0-oracle-thin-extras.jar
2、获取数据源
相关参数配置方式一: 硬编码
ComboPooledDataSource c3p0 = new ComboPooledDataSource(); //核心方法
try {
c3p0.setDriverClass("oracle.jdbc.driver.OracleDriver");
} catch (PropertyVetoException e) {
e.printStackTrace();
}
c3p0.setJdbcUrl("jdbc:oracle:thin:@127.0.0.1:1521:ORCL");
c3p0.setUser("scott");
c3p0.setPassword("tiger");
return c3p0 ;
相关参数配置方式一: 配置文件 ,c3p0-config.xml
c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config> // 默认配置
<!-- 如果要研究某个xml中可以设置哪些属性。找相关类的 属性 或者setXxx()-->
<property name="user">scott</property>
<property name="password">tiger</property>
<property name="driverClass">oracle.jdbc.driver.OracleDriver</property>
<property name="jdbcUrl">jdbc:oracle:thin:@127.0.0.1:1521:ORCL</property>
<property name="checkoutTimeout">30000</property>
</default-config>
<named-config name="id"> //自定义的配置 可覆盖默认配置
<property name="user">scott</property>
<property name="password">tiger</property>
<property name="driverClass">oracle.jdbc.driver.OracleDriver</property>
<property name="jdbcUrl">jdbc:oracle:thin:@127.0.0.1:1521:ORCL</property>
<property name="checkoutTimeout">20000</property>
</named-config>
</c3p0-config>
获取
ComboPooledDataSource c3p0 = new ComboPooledDataSource("id"); //核心方法 自动寻找 c3p0-config.xml
return c3p0 ;
相关参数
acquireIncrement:当连接池中的连接耗尽的时候 c3p0 一次同时获取的连接数。Default: 3
acquireRetryAttempts: 定义在从数据库获取新连接失败后重复尝试的次数。Default: 30
acquireRetryDelay:两次连接中间隔时间,单位毫秒。Default: 1000 -
autoCommitOnClose :连接关闭时默认将所有未提交的操作回滚。Default: false
automaticTestTable: c3p0将建一张名为Test的空表,并使用其自带的查询语句进行测试。
如果定义了这个参数那么 属性preferredTestQuery将被忽略。
你不能在这张Test表上进行任何操作,它将只供c3p0测试 使用。Default: null
breakAfterAcquireFailure:获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。
但是数据源仍有效 保留,并在下次调用getConnection()的时候继续尝试获取连接。
如果设为true,那么在尝试 获取连接失败后该数据源将申明已断开并永久关闭。Default: false
checkoutTimeout: 当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出
SQLException,如设为0则无限期等待。单位毫秒。Default: 0
connectionTesterClassName:通过实现ConnectionTester或QueryConnectionTester的类来测试连接。
类名需制定全路径。
Default: com.mchange.v2.c3p0.impl.DefaultConnectionTester
factoryClassLocation: 指定c3p0 libraries的路径,如果(通常都是这样)在本地即可获得那么无需设置,默认null即可
Default: null
forceIgnoreUnresolvedTransactions: Strongly disrecommended.
Setting this to true may lead to subtle and bizarre bugs. (文档原文)作者强烈建议不使用的一个属性
idleConnectionTestPeriod : 每60秒检查所有连接池中的空闲连接。Default: 0
initialPoolSize: 初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3
maxIdleTime:最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0
maxPoolSize:连接池中保留的最大连接数。Default: 15
maxStatements:JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。
但由于预缓存的statements 属于单个connection而不是整个连接池。
所以设置这个参数需要考虑到多方面的因素。
如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0
maxStatementsPerConnection:定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0
numHelperThreads: c3p0是异步操作的,缓慢的JDBC操作通过帮助进程完成。
扩展这些操作可以有效的提升性能 通过多线程实现多个操作同时被执行。Default: 3
overrideDefaultUser : 当用户调用getConnection()时使root用户成为去获取连接的用户。
主要用于连接池连接非c3p0 的数据源时。Default: null
overrideDefaultPassword:与overrideDefaultUser参数对应使用的一个参数。Default: null
password:密码。Default: null
preferredTestQuery : 定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。
注意:
测试的表必须在初始数据源的时候就存在。Default: null 可填写语句 select id from test where id=1
propertyCycle:用户修改系统配置参数执行前最多等待XX秒。Default: 30
0testConnectionOnCheckout:
因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的
时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable
等方法来提升连接测试的性能。Default: false
testConnectionOnCheckin:如果设为true那么在取得连接的同时将校验连接的有效性。Default: false
user:用户名。Default: null
usesTraditionalReflectiveProxies : 早期的c3p0版本对JDBC接口采用动态反射代理。
在早期版本用途广泛的情况下,这个参数 , 允许用户恢复到动态反射代理以解决不稳定的故障。
最新的非反射代理更快并且已经开始 广泛的被使用,所以这个参数未必有用。
现在原先的动态反射与新的非反射代理同时受到 支持,
但今后可能的版本可能不支持动态反射代理。Default: false
所有连接池的思路:
a.硬编码,某个连接池数据源的 对象 ds = new XxxDataSource(); ds.setXxx(); return ds ;
b.配置文件, ds = new XxxDataSource();加载配置文件 ,return ds ;
数据源工具类
dbcp、c3p0, druid
本文详细介绍了三种常见的数据库连接池技术:Tomcat-dbcp、commons-dbcp 和 c3p0 的配置与使用方法。包括如何通过 Java 代码获取数据源、连接池参数配置以及通过 JNDI 在 Tomcat 中配置数据源。
1239

被折叠的 条评论
为什么被折叠?



