前一阵子同事让看一个数据库连接的问题,说是弄了好久了都不成功,不知道问题出在哪里。我想着不就是连接数据库嘛,一个JDBC能有多难,过去一看,用的DataSource、Context.lookup,没见过这种的,,就顿时傻眼了。于是先用常规的JDBC连接方式解决他现在的问题,事后自己来琢磨这个什么鬼。
百度了一下这个东东,说的都是跟jndi有关系,本人不懂JNDI,也没深入研究这个,只是把这种数据库的连接方式整明白了,这里记录下做个备注。
1、在容器中添加配置:
从所谓的Context上下文应该就能看出来,这种方式依赖容器,必须得把项目发到到服务器上才能用。所以第一步就是在容易中进行相应配置啦。我这里用的是Tomcat6.0。
打开tomcat的conf/context.xml文件,在Context标签内添加如下代码:
<Resource name="jdbc/sqlconnpool"
auth="wjl"
type="javax.sql.DataSource"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://127.0.0.1:1433;databaseName=test"
username="sa"
password="sa"
maxActive="100"
maxIdle="30"
maxWait="10000"/>
要修改的地方有以下几个:
a、name:这个可以随便写,但是一定要记住,后面有地方要用;
b、driverClassName:驱动信息,根据要连接的数据库写就好,我这里连接的是SQL Server
c、url:数据库连接,主要填数据库所在的IP地址、端口号和连接的数据库名称
d、username:登陆数据库的用户名
e、password:登陆数据库的密码
(PS:跟Hibernate、spring中的配置超像)
2、在web.xml中添加配置:
<resource-ref>
<description>DB Connection Pool</description>
<res-ref-name>jdbc/sqlconnpool</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>wjl</res-auth>
</resource-ref>
修改的点:
a、res-ref-name:必须与容器中的name属性相同
b、res-type:javax.sql.DataSource,必须填这个
c、res-auth:最好与与容器中的相同
至于description,随便填。
3、添加测试:
这个测试与一般的JDBC数据库连接测试不一样,不能直接用main方法测试,得发布项目,通过项目进行访问。我本地用的是Servlet:
try { Context ctx = new InitialContext(); Context envContext = (Context) ctx.lookup("java:/comp/env"); DataSource ds = (DataSource) envContext.lookup("jdbc/sqlconnpool");//与context.xml中的name相同、与web.xml中的res-ref-name相同 Connection conn = ds.getConnection(); System.out.println(conn); conn.close(); } catch (NamingException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); }
至此,使用DataSource连接数据完成。