最近写了一个WEB项目发现只是使用JDBC数据库,总是会出现“预登录”错误,原因就是因为数据库连接的数目是有限的,所以使用JNDI连接数据库就会解决上述问题,通过JNDI会创建一个数据库连接池,在DataSource中事先建立了多个数据库连接,这些数据库连接保存在连接池(Connect Pool)中。Java程序访问数据库时,只需要从连接池中取出空闲状态的数据库连接;当程序访问数据库结束,再将数据库连接放回连接池。
以下是如何进行配置:
1,在Tomcat中配置:
a.>tomcat 安装目录下的conf的context.xml 的
<Context></Context>中
<Resource name="jdbc/db_net" auth="Container" type="javax.sql.DataSource" maxActive="10"
maxIdel="10" maxWait="1000" username="lifan" password="sqllifan2005"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://localhost:1434;Database=db_net">
</Resource>
其中
name 表示指定的jndi名称
auth 表示认证方式,一般为Container
type 表示数据源床型,使用标准的javax.sql.DataSource
maxActive 表示连接池当中最大的数据库连接
maxIdle 表示最大的空闲连接数
maxWait 当池的数据库连接已经被占用的时候,最大等待时间
username 表示数据库用户名
password 表示数据库用户的密码
driverClassName 表示JDBC DRIVER
url 表示数据库URL地址
b.>将相应的jar包拷贝到Tomcat服务器下的lib目录中,jar包名称如下
commons-dbcp.jar
commons-pool.jar
commons-collections-2.1.jar
c.>获得Connection对象的代码如下
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
private static Connection cn = null;
/*
* 得到Connection对象
*/
private void getConnection() {
try {
Context context = new InitialContext();
DataSource ds = (DataSource)context.lookup ("java:/comp/env/jdbc/db_net");//jdbc/db_net是上面name属性的值
cn = ds.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
}
2.但是如果你的Tomcat下有多个apps,只想对特定的项目进行JNDI的配置所以你应该在webRoot下的META-INT目录下建立context.xml文件,在上面的content内容中再添加一条语句factory="org.apache.commons.dbcp.BasicDataSourceFactory"
同时将上面的jar包拷贝到webRoot下的WEB-INFO下的lib目录中
获取Connection对象的代码保持不变