使用JNDI连接数据库
第一步:实现一个Java类:
package com.logistic.data;
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
import java.sql.Date;
//import java.text.SimpleDateFormat;
public class DataConnect {
private Connection con;
private Statement stmt;
private ResultSet rs;
private PreparedStatement pstmt;
public static int error=0;
public static synchronized Connection getCon()throws Exception{
Context ctx;
DataSource ds;
try{
ctx = new InitialContext();
ds = (DataSource)ctx.lookup("java:comp/env/jdbc/DBPool");
if(ds==null){
System.err.println();
System.err.println("数据连接打开+"+(++error));
}
return ds.getConnection();
}catch(SQLException e){
System.out.print(e);
throw e;
}
catch(NamingException e){
System.out.print(e);
throw e;
}
}
public Statement getStmtread(){
try{
con=getCon();
stmt=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
}catch(Exception e){
System.out.println("getStmtread");
System.out.println(e.getMessage());
}
return stmt;
}
public int getRowCount(String sql){
int count=0;;
try{
stmt=this.getStmtread();
rs=stmt.executeQuery("SELECT COUNT(*) FROM "+sql);
rs.getMetaData();
if(rs.next()){
count=rs.getInt(1);
}else{
count=-1;
}
}catch(Exception e){
System.out.println("getRowCount");
System.out.println(e.getMessage());
count=-2;
}finally{
this.close();
}
return count;
}
public Statement getStmt(){
try{
con=getCon();
stmt=con.createStatement();
}catch(Exception e){
System.out.println("getStmt");
System.out.println(e.getMessage());
}
return stmt;
}
public PreparedStatement getPstmt(String sql){
try{
con=getCon();
pstmt=con.prepareStatement(sql);
}catch(Exception e){
System.out.println("getPstmt");
System.out.println(e.getMessage());
}
return pstmt;
}
public void close(){
try{
if(rs!=null)rs.close();
}catch(Exception e){
}
try{
if(stmt!=null)stmt.close();
}catch(Exception e){
}
try{
if(con!=null){
con.close();
con=null;
System.err.println();
System.err.println("数据连接关闭-"+(--error));
}
}catch(Exception e){
System.out.println("close");
System.out.println(e.getMessage());
}
}
public String inStr(String str){
String tempstr=null;
if(str==null){
str="";
}else{
try{
tempstr=new String(str.getBytes("ISO-8859-1"),"GB2312");
//tempstr=str.replace('\'',(char)1);
}catch(Exception e){
System.out.println("inStr");
System.out.println(e.getMessage());
}
}
return tempstr;
}
public String outStr(String str){
if(str==null){
str="";
}else{
try{
str=str.replace((char)1,'\'');
}catch(Exception e){
System.out.println("outStr");
System.out.println(e.getMessage());
}
}
return str;
}
public int selectdata(String sqls){
int k=-10;
try{
k=0;
rs=this.getStmtread().executeQuery(sqls);
while(rs.next()){
k++;
}
}catch(Exception ex){
k=-1;
System.out.println("select");
System.out.println(ex.getMessage());
this.close();
}finally{
this.close();}
return k;
}
public int updata(String sqls){
int k=-10;
try{
k=0;
k=this.getStmt().executeUpdate(sqls);
}catch(Exception ex){
k=-1;
System.out.println("updata");
System.out.println(ex.getMessage());
this.close();
}finally{this.close();}
return k;
}
public Date StrConvertDate(String strdate)
{
Date convertdate=null;
try{
convertdate= Date.valueOf(strdate);
System.out.print("打印日期");
System.out.print(convertdate.toString());
}catch(Exception ex){ex.printStackTrace();}
return convertdate;
}
}
通过getCon()就可以获取到连接了,其他是多余的
接下来是重点,也就是getCon()是如何获取到连接的
第二步:
配置web.xml文件
<!-- JNDI -->
<resource-ref>
<description>MySQL DB Connection Pool</description>
<res-ref-name>jdbc/DBPool</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
红色字体与Java文件中的必需一致,编译时时通过这些描述符来实现映射
java:comp/env/jdbc/DBPool(虚地址) ------> 映射描述符 ------> jdbc/DBPool(实际的地址)
单单这样子还是不够的,在Tomcat中还需要和该web.xml文件建立连接
第三步:配置Tomcat目录下conn文件夹中的context.xml配置文件
在<Context>
<Resource
name="jdbc/DBPool"
type="javax.sql.DataSource"
password=""
driverClassName="com.mysql.jdbc.Driver"
maxIdle="20"
maxWait="5000"
username="root"
url="jdbc:mysql://localhost:3306/logistic"
/>
</Context>
以上是以MySql作为数据库,如果用其他数据库,改变url和driverClassName即可,但必需保证用户名、密码正确。
完成以后,还要将连接数据库的jar包,放在 Tomcat6/lib 目录下,而 Tomcat6/bin 下不需要放此jar包 。
可能有的网友调试的时候会报这个错误:
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.initialException in thread "main" 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
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325)
at javax.naming.InitialContext.lookup(InitialContext.java:392)
at gzgl.DataConnect.getCon(DataConnect.java:31)
at gzgl.DataConnect.main(DataConnect.java:23)
这是因为通过JNDI获取连接,程序必须通过Tomcat容器来加载连接,即通过web.xml来建立连接,如果只是在Java代码里面测试,是无法获取到连接的,因此,可以通过JSP(如index,jsp里面)进行如下测试:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@page contentType="text/html; charset=UTF-8"%>
<%@page import="java.sql.*" %>
<%@page import="javax.naming.*" %>
<%@page import="javax.sql.DataSource" %>
<%@page import="com.logistic.data.*" %>
<head>
<title>Tomcat6.0 JNDI!</title>
</head>
<body>
This is my JSP page. <br>
JNDI ... <br>
<%
try {
DataConnect.getCon();
out.println("连接成功...");
} catch (Exception e) {
e.printStackTrace();
}
%>
</body>
</html>
在浏览器输入地址,可以看到运行结果:
OK,连接成功!
使用JNDI连接数据库的更多相关文章
- tomcat6配置jndi连接数据库的方式
eworkflow工作流+eform表单+ebiao报表集成在一起,用tomcat6发布,并用jndi连接数据库,数据库是sqlserver2005,配置如下: 1.在tomcat6\conf\con ...
- 用JNDI连接数据库
之前说到了利用Java中的Properties类读取properties配置文件,连接数据库,现在说另一种方法,他们的目的和作用都是一样的,都是为了提高代码的复用性,解决了更改数据库 时还要更改代码的 ...
- JNDI连接数据库的详细步骤 以及简要的c3po数据库连接的配置
第一步在tomcat的context.xml文件中配置数据源:context.xml的路径形式是:D:\Program Files (x86)\apache-tomcat-6.0.44\conf\co ...
- Tomcat,Jboss,Weblogic通过jndi连接数据库
1. Tomcat配置Jndi数据源 1.1在tomcat服务器的lib目录下加入数据库连接的驱动jar包 1.2修改tomcat服务器的conf目录下server.xml配置文件 编辑server ...
- jndi连接数据库配置过程总结
一.我们先找到tomcat安装目录中conf目录下的context.xml更改里面的内容: <?xml version='1.0' encoding='utf-8'?> <Conte ...
- Quartz集群配置
先看看quartz的持久化基本介绍: 引用 1 大家都清楚quartz最基本的概念就是job,在job内调用具体service完成具体功能,quartz需要把每个job存储起来,方便调度,quartz ...
- javax.naming.NoInitialContextException错误的解决方案
今天,学习用了一下nutz框架,写了一个HelloWorld的小程序,在用jndi配置数据源时,写了一个测试类,并在main方法中调用了jndi获得数据库连接,但是报错了,错误信息如下: javax. ...
- javax.naming.NoInitialContextException: Need to specify class name in environment or system property
javax.naming.NoInitialContextException: Need to specify class name in environment or system property ...
- Tomcat 配置连接池
1. Tomcat 配置 JNDI 资源 JNDI(Java Naming and Directory Interface), Java 命名和目录接口; JNDI 作用: 在服务器上配置资源, 然后 ...
随机推荐
- HDU 5575 Discover Water Tank 并查集 树形DP
题意: 有一个水槽,边界的两块板是无穷高的,中间有n-1块隔板(有高度),现有一些条件(i,y,k),表示从左到右数的第i列中,在高度为(y+0.5)的地方是否有水(有水:k = 1),问最多能同时满 ...
- Codeforces Round #300 D. Weird Chess 水题
D. Weird Chess Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/538/proble ...
- PAT甲级1018. Public Bike Management
PAT甲级1018. Public Bike Management 题意: 杭州市有公共自行车服务,为世界各地的游客提供了极大的便利.人们可以在任何一个车站租一辆自行车,并将其送回城市的任何其他车站. ...
- 为什么MyISAM会比Innodb的查询速度快
INNODB在做SELECT的时候,要维护的东西比MYISAM引擎多很多: 1)数据块,INNODB要缓存,MYISAM只缓存索引块, 这中间还有换进换出的减少: 2)innodb寻址要映射到块,再 ...
- 【美】范·K·萨普曼 - 通向财务自由之路(2013年11月26日)
<通向财务自由之路> 作 者:[美]范·K·萨普曼 译 者:董梅 系 列: 出 版:机械工业出版社 字 数:约40千字 阅读完成:2013年11月26日
- centos安装单机zookeeper
1.下载zookeeper版本 wget http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz ...
- gridview 空数据绑定
private void getDataBind() { DataTable dt = new DataTable(); dt.Columns.Add("id"); dt.Colu ...
- IOS-百度地图API用点生成线路、导航、自定义标注 2013年11月更新
IOS百度地图API开发自定义气泡,点击气泡自动生成路线,以及拖拽IOS百度地图开发POISearch搜索附近停车场,附近加油站IOS百度地图视角跳到用户当前位置IOS百度地图开发实时路况IOS开发百 ...
- Android中MVC模型(复合模式)
mvc是model,view,controller的缩写,mvc包括三个部分: 1.模型(model)对象:是应用程序的主体部分,全部的业务逻辑都应该写在该层. 2.视图(view)对象:是应用程序中 ...
- .NET Versioning and Multi-Targeting - .NET 4.5 is an in-place upgrade to .NET 4.0
Say what you will about the past ridiculousness of .NET Framework versioning, since the confusion of ...