1.创建连接需要耗费时间:创建一个连接大概需要1-2秒的时间。
2.在某一时刻连接必须服务于一个用户,以免造成事务冲突:来自不同用户的请求(都使用了同一个连接)对相同的事务进行操作,如果一个请求试图回滚,那么所有使用相同连接的数据库操作都要被回滚。
3.保持连接打开状态的代价很大:尤其是在系统资源(例如内存)方面。数据库产品的许可证都按照同时打开的连接数目来收费。
JDBC 2.0中提供了 javax.sql.DataSource (数据源)接口,它负责建立与数据库的连接,在应用程序中访问数据库时不必编写连接数据库的代码,可以直接从数据源获取数据库连接。
4.连接池中保存了一些Connection对象,这些对象被所有Servlet和JSP页面所共享。对于每个请求都会分配给它一个连接,使用完后再收回这个连接。
5.创建连接需要时间:放入池中的连接只被创建一次,以后一直重用这个连接
6.共享连接会造成多线程问题:每个请求将得到它自己的Connection对象,所以在某一时刻它只被一个线程使用,从而避免了潜在的多线程问题
7.连接的资源有限:每个连接都会得到有效的使用
数据库连接池是非常占用系统资源的,对它的管理能够显著影响到整个应用程序的伸缩性和健壮性。
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接,以避免因为没有释放数据库连接而引起的数据库连接遗漏。
数据库连接池在初始化时将创建一定数量的数据库连接放在连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接释放被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入等待队列中。
Javax.naming.Context提供了查找JNDI Resource的接口。
Context ctx=new InitialContext();
DataSource ds=(DataSource)ctx.lookup(“java:comp/env/jdbc/books”);
JNDI的配置:
1.路径:Tomcat根目录"conf"content.xml文件中的<Context>节点中添加<Resource>信息。
<Context>
…//原有的配置
<Resource name="jdbc/books" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30"
maxWait="10000" username="sa" password="sa"
driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
url="jdbc:microsoft:sqlserver://localhost:1433;databasename=books"
/>
</Context>
name:连接池名称(jdbc/sqlserver);
auth:控制身份验证(Container或Application);
type:资源类型( javax.sql.DataSource );
driveClassName:JDBC驱动类的完整的名称;
url:到JDBC的URL连接;
username :用户名称;
password:用户密码;
maxActive:同时能够从连接池中被分配的可用实例的最大数;
maxIdle:可以同时闲置在连接池中的连接的最大数;
maxWait:最大超时时间,以毫秒计;
2.Web.xml文件的配置
<resource-ref>
<description>E-Books DataSource</description>
<res-ref-name>jdbc/books</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
res-ref-name:资源名
res-type:资源类型
res-auth:控制身份验证(Container或Application)
3.添加数据库驱动文件
把JDBC驱动程序复制到Tomcat的common"lib目录下面。
使用JNDI的好处:在设计项目时,为了提高系统性能,减少资源消耗,使用JNDI方式进行数据库访问,是个很好的方法。
获取连接
public static Connection getConnection() {
Connection conn = null;
try {
Context ctx = new InitialContext();
if (ctx == null)
throw new Exception("No context!");
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/sqlserver");
if (ds == null)
throw new Exception("DataSource not defined!");
conn = ds.getConnection();
if (conn == null)
throw new Exception("connect is null!");
} catch (Exception ex) {
ex.printStackTrace();
}
return conn;
}