JNDI的全称是java命名与目录接口(Java Naming and Directory
Interface),是一个应用程序设计的API,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口。我们可以把JNDI简单地理解为是一种将对象和名字绑定的技术,即指定一个资源名称,将该名称与某一资源或服务相关联,当需要访问其他组件和资源时,就需要使用JNDI服务进行定位,应用程序可以通过名字获取对应的对象或服务。
1contextxml文件设置
数据源:Tomcat根目录\conf\contextxml文件(没有直接创建也可以)或者在JSP项目WebRoot目录下的META-INF目录中创建一个contextxml文件,添加Context节点,如下:
1 <Context>
2 <Resource name="jdbc/test" auth="Application" type="javaxsqlDataSource"
3 maxActive="100" maxIdle="30" maxWait="10000" username="sa" password="1234"
4 driverClassName="commicrosoftsqlserverjdbcSQLServerDriver" url="jdbc:sqlserver://1921682254:1433;DatabaseName=test" />
5 </Context>
name:指定Resource的JNDI名字。
auth:可以写成Container和Application。Container表示由容器创建Resource,Application表示由Web应用创建和管理Resource。
type:指定Resource所属的Java类名。
maxActive:指定数据库连接池中处于活动状态的数据库连接的最大数目。
maxIdle:指定数据库连接池中处于空闲状态的数据库连接的最大数目,取值为0表示不受限制。
maxWait:指定数据库连接池中数据库连接处于空闲状态的最长时间(以毫秒为单位),超出这时间将会抛出异常。
username:指定连接数据库的用户名。
password:指定连接数据库的口令。
driverClassName:指定连接数据库的JDBC驱动程序。
url:指定连接数据库的URL。
2webxml文件的配置
在Web应用程序的WEB-INF/webxml文件中的<web-app>节点下添加<resource-ref>元素,内容如下:
1 <web-app>
2
3 <resource-ref>
4 <description>news DataSource</description>
5 <res-ref-name>jdbc/test</res-ref-name>
6 <res-type>javaxsqlDataSource</res-type>
7 <res-auth>Container</res-auth>
8 </resource-ref>
9 </web-app>
description:对所引用资源的说明。
res-ref-name:指定所引用资源的JNDI名字,与<Resource>元素中的name属性对应。
res-type:指定所引用资源的类名字,与<Resource>元素中的type属性对应。
res-auth:指定管理所引用资源的Manager,与<Resource>元素中的auth属性对应。
3在Web应用中添加数据库连接jar文件。
4编写使用数据源和JNDI资源,创建采用数据库连接池Connection对象的SqlHelperjava文件(在helper包中创建的),代码如下:
1 package helper;
2 import javalangreflect;
3 import javasql;
4 import javautil;
5
6 import javaxnamingContext;
7 import javaxnamingInitialContext;
8 import javaxnamingNamingException;
9 import javaxsqlDataSource;
10
11 public class SqlHelper {
12
13 private static Connection getConnection() throws ClassNotFoundException,
14 SQLException {
15 Connection conn = null;
16 try {
17 Context ctx = new InitialContext();
18 // 获取与逻辑名相关联的数据源对象
19 DataSource ds = (DataSource) ctxlookup("java:comp/env/jdbc/test");
20 conn = dsgetConnection();
21 } catch (NamingException e) {
22 // TODO Auto-generated catch block
23 eprintStackTrace();
24 } catch (SQLException e) {
25 // TODO Auto-generated catch block
26 eprintStackTrace();
27 }
28 return conn;
29 }
30
31 public static int executeNonQuery(String cmdText)
32 throws ClassNotFoundException, SQLException {
33 int result = -1;
34 Connection con = null;
35 PreparedStatement ps = null;
36 try {
37 con = getConnection();
38 ps = conprepareStatement(cmdText);
39 result = psexecuteUpdate();
40 }catch (Exception e) {
41 Systemoutprintln(e);
42 } finally {
43 close(con, ps, null);
44 }
45 return result;
46 }
47
48 public static int executeScalar(String cmdText) throws SQLException,
49 ClassNotFoundException {
50 int result = -1;
51 Connection con = null;
52 PreparedStatement ps = null;
53 ResultSet rs = null;
54 try {
55 con = getConnection();
56 ps = conprepareStatement(cmdText);
57 rs = psexecuteQuery();
58 if (rsnext()) {
59 result = rsgetInt(1);
60 }
61 }catch (Exception e) {
62 Systemoutprintln(e);
63 } finally {
64 close(con, ps, rs);
65 }
66 return result;
67 }
68
69 public static <T> List<T> executeList(Class<T> cls, String cmdText)
70 throws ClassNotFoundException, SQLException,
71 InstantiationException, IllegalAccessException {
72 List<T> list = new ArrayList<T>();
73 Connection con = null;
74 PreparedStatement ps = null;
75 ResultSet rs = null;
76 try {
77 con = getConnection();
78 ps = conprepareStatement(cmdText);
79 rs = psexecuteQuery();
80 while (rsnext()) {
81 T obj = executeResultSet(cls, rs);
82 listadd(obj);
83 }
84 } catch (Exception e) {
85 Systemoutprintln(e);
86 }finally {
87 close(con, ps, rs);
88 }
89 return list;
90 }
91
92 public static <T> T executeEntity(Class<T> cls, String cmdText)
93 throws SQLException, ClassNotFoundException,
94 InstantiationException, IllegalAccessException {
95 T obj = null;
96 Connection con = null;
97 PreparedStatement ps = null;
98 ResultSet rs = null;
99 try {
100 con = getConnection();
101 ps = conprepareStatement(cmdText);
102 rs = psexecuteQuery();
103 while (rsnext()) {
104 obj = executeResultSet(cls, rs);
105 break;
106 }
107 } catch (Exception e) {
108 Systemoutprintln(e);
109 }finally {
110 close(con, ps, rs);
111 }
112 return obj;
113 }
114
115 private static <T> T executeResultSet(Class<T> cls, ResultSet rs)
116 throws InstantiationException, IllegalAccessException, SQLException {
117 T obj = clsnewInstance();
118 ResultSetMetaData rsm = rsgetMetaData();
119 int columnCount = rsmgetColumnCount();
120 // Field[] fields = clsgetFields();
121 Field[] fields = clsgetDeclaredFields();
122 for (int i = 0; i < fieldslength; i++) {
123 Field field = fields[i];
124 String fieldName = fieldgetName();
125 for (int j = 1; j <= columnCount; j++) {
126 String columnName = rsmgetColumnName(j);
127 if (fieldNameequalsIgnoreCase(columnName)) {
128 Object value = rsgetObject(j);
129 fieldsetAccessible(true);
130 fieldset(obj, value);
131 break;
132 }
133 }
134 }
135 return obj;
136 }
137
138 private static void close(Connection con, PreparedStatement ps, ResultSet rs)
139 throws SQLException {
140 if (rs != null) {
141 rsclose();
142 rs = null;
143 }
144 if (ps != null ) {
145 psclose();
146 ps = null;
147 }
148 if (con != null) {
149 conclose();
150 con = null;
151 }
152 }
153 }
View Code
5搭建entity,dal,bll包。(三层是从net开发转过来的,也可以使用do包,dao包)。
6JSP页面使用代码如下:
1 <%@ page language="java" import="javautil,bll,entity" pageEncoding="UTF-8"%>
2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 401 Transitional//EN">
3 <html>
4 <head>
5 <title>采用数据源和JNDI资源方式,创建并使用数据库连接池对象访问数据库实例。</title>
6 </head>
7 <body>
8 <div>
9 <h1>采用数据源和JNDI资源方式,创建并使用数据库连接池对象访问数据库实例。</h1>
10 <%
11 List<Student> list = StudentBLLSelect();
12 for (Student student : list) {
13 outprintln(Stringformat(
14 "<ol><li>StudentId:%d</li><li>StudentName:%s</li><li>Phone:%s</li><li>Email:%s</li><li>Address:%s</li></ol>",
15 studentgetStudentId(), studentgetStudentName(),
16 studentgetPhone(), studentgetEmail(),
17 studentgetAddress()));
18 }
19 %>
20 </div>
21 </body>
22 </html>
View Code
7如果Context文件中auth属性设置为:Container,需要将数据库连接的jar文件复制到Tomcat的lib目录下。如果auth属性设置为:Application,则不需要复制到Tomcat的lib目录下。
8部署运行界面大功告成。
jdbc是数据库中间代理商为了是java连接数据库而定的一个协议 或者说是方法,通过jdbc-odbc的方法进行数据库连接,是连接一次创建一次的做法 1,由数据库驱动和协议组成连接数据的方法,调用中间商提供的类包,进行创建连接 2再由连接去调用3种状态 3由状态来提供对数据库的 *** 作 jndi是一种命名树的方式,把需要的类都列成目录的样式,需要哪个只要根据命名直接去 调用,是一种比较快洁的思想和行为 当你要 *** 作数据库的用jdbc *** 作命名服务用jndi Java Database Connectivity (JDBC)是一个标准的Java API,它由一组类和接口组成,Java应用程序开发人员使用它来访问数据库和执行SQL语句 JNDI(Java Name Directory Interface),可不仅仅是进行数据库定位的, 它是给当前应用服务器所管理的所有资源一个唯一的标识,包括数据库,网页,文件, 连接池等等。
配置 JNDI绑定
此处绑定的数据源是以 DBCP 为实现。首先必须将数据库驱动(这里用了MYSQL数据库)和DBCP所需要的 Jar 包复制到 Jetty 根目录的 lib 目录下。DBCP主要需要以下3个文件:
Commons-dbcpjar
Commons-pooljar
Commons-collectionsjar
jdbc和jndi区别
Connection conn = null;
try{
ClassforName("commysqljdbcDriver",true,ThreadcurrentThread()getContextClassLoader());
conn = DriverManagergetConnection("jdbc:mysql://MyDBServeruser=&password=");
connclose();
}
catch(){}finally{
if(conn!=null){
try{
connclose();
}
catch(){}
}
}
存在的问题?
1、数据库服务器名称MyDBServer 用户名和口令可能需要修改,由此引发JDBC URL修要修改;
2、数据库可能该用别的产品;
3、随着实际终端的增加,原配置的连接池参数可能需要调整;
解决办法
程序员不必关心数据库级别的事情,只需要知道如何引用即可
JNDI出现了。
定义数据源,也就是JDBC引用参数,给这个数据源设置一个名称;
在程序中通过数据源名称引用数据源,从而访问数据库;
//jndi连接
Context initCtx = new InitialContext();
Context envCtx = (Context)initCtxlookup("java:comp/env");
DataSource ds = (DataSource)envCtxlookup("jdbc/webtest");
conn = dsgetConnection();
//jdbc连接
ClassforName("commysqljdbcDriver",true,ThreadcurrentThread()getContextClassLoader());
conn = DriverManagergetConnection("jdbc:mysql://localhost/mismainuser=root&autoReconnect=true");
程序员开发时,知道要开发访问MySQL数据库的应用,于是将一个对 MySQL JDBC 驱动程序类的引用进行了编码,并通过使用适当的 JDBC URL 连接到数据库。
就像以下代码这样:
Connection conn=null;
try {
ClassforName("commysqljdbcDriver", true, ThreadcurrentThread()getContextClassLoader());
conn=DriverManagergetConnection("jdbc:mysql://MyDBServeruser=qingfeng&password=mingyue");
connclose();
} catch(Exception e) {
eprintStackTrace();
} finally {
if(conn!=null) {
try {
connclose();
} catch(SQLException e) {}
}
}
这是传统的做法,也是以前非Java程序员(如Delphi、VB等)常见的做法。这种做法一般在小规模的开发过程中不会产生问题,只要程序员熟悉Java语言、了解JDBC技术和MySQL,可以很快开发出相应的应用程序。
没有JNDI的做法存在的问题:1、数据库服务器名称MyDBServer 、用户名和口令都可能需要改变,由此引发JDBC URL需要修改;2、数据库可能改用别的产品,如改用DB2或者Oracle,引发JDBC驱动程序包和类名需要修改;3、随着实际使用终端的增加,原配 置的连接池参数可能需要调整;4、……
解决办法:程序员应该不需要关心“具体的数据库后台是什么?JDBC驱动程序是什么?JDBC URL格式是什么?访问数据库的用户名和口令是什么?”等等这些问题,程序员编写的程序应该没有对 JDBC 驱动程序的引用,没有服务器名称,没有用户名称或口令 —— 甚至没有数据库池或连接管理。而是把这些问题交给J2EE容器来配置和管理,程序员只需要对这些配置和管理进行引用即可。
由此,就有了JNDI
用了JNDI之后的做法:首先,在在J2EE容器中配置JNDI参数,定义一个数据源,也就是JDBC引用参数,给这个数据源设置一个名称;然后,在程序中,通过数据源名称引用数据源从而访问后台数据库。
具体 *** 作如下(以JBoss为例):
1、配置数据源
在JBoss 的 D:\jboss420GA\docs\examples\jca 文件夹下面,有很多不同数据库引用的数据源定义模板。将其中的 mysql-dsxml 文件Copy到你使用的服务器下,如 D:\jboss420GA\server\default\deploy。
修改 mysql-dsxml 文件的内容,使之能通过JDBC正确访问你的MySQL数据库,
如下:
Connection conn=null;
try {
ClassforName("commysqljdbcDriver", true, ThreadcurrentThread()getContextClassLoader());
conn=DriverManagergetConnection("jdbc:mysql://MyDBServeruser=qingfeng&password=mingyue");
connclose();
} catch(Exception e) {
eprintStackTrace();
} finally {
if(conn!=null) {
try {
connclose();
} catch(SQLException e) {}
}
}
<xml version="10" encoding="UTF-8">
<datasources>
<local-tx-datasource>
<jndi-name>MySqlDS</jndi-name>
<connection-url>jdbc:mysql://localhost:3306/lw</connection-url>
<driver-class>commysqljdbcDriver</driver-class>
<user-name>root</user-name>
<password>rootpassword</password>
<exception-sorter-class-name>orgjbossresourceadapterjdbcvendorMySQLExceptionSorter</exception-sorter-class-name>
<metadata>
<type-mapping>mySQL</type-mapping>
</metadata>
</local-tx-datasource>
</datasources>
这里,定义了一个名为MySqlDS的数据源,其参数包括JDBC的URL,驱动类名,用户名及密码等。
2、在程序中引用数据源:
Connection conn=null;try {
Context ctx=new InitialContext();
Object datasourceRef=ctxlookup("java:MySqlDS"); //引用数据源 DataSource ds=(Datasource)datasourceRef; conn=dsgetConnection();
cclose();
} catch(Exception e) {
eprintStackTrace();
} finally {
if(conn!=null) {
try {
connclose();
} catch(SQLException e) { }
}
}
直接使用JDBC或者通过JNDI引用数据源的编程代码量相差无几,但是现在的程序可以不用关心具体JDBC参数了。
在系统部署后,如果数据库的相关参数变更,只需要重新配置 mysql-dsxml 修改其中的JDBC参数,只要保证数据源的名称不变,那么程序源代码就无需修改。
由此可见,JNDI避免了程序与数据库之间的紧耦合,使应用更加易于配置、易于部署。
JNDI(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API。命名服务将名称和对象联系起来,使得我们可以用名称访问对象。
public void testConnection() {
Context context = null;
Properties properties = null;
try {
String url = "iiop://localhost:2809";//端口指的是BOOTSTAR_ADDRESS 端口 在websphere控制台能查到
String user = "用户名";
String password = "密码";
if (context == null) {
properties = new Properties();
propertiesput("javanamingfactoryinitial",
"comibmwebspherenamingWsnInitialContextFactory");
}
propertiesput("javanamingproviderurl", url);
propertiesput("javanamingsecurityprincipal", user);
propertiesput("javanamingsecuritycredentials",
(password == null) "" : password);
context = new InitialContext(properties);
/
webxml配置
<resource-ref>
<res-ref-name>jdbc/oracle_datasource</res-ref-name>
<res-type>javaxsqlDataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
/
DataSource ds = (DataSource)contextlookup("oracle_datasource");
Connection conn = dsgetConnection();
} catch (Exception ex) {
exprintStackTrace();
}
}
其他非ssh框架项目正常运行说明你数据源配置的没有问题
那看下你的applicationContextxml中:
<bean id="dataSource"
class="orgspringframeworkjndiJndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/jdbc/mldn</value>
</property>
</bean>
用JNDI查找一下这个数据源就可以了
答案补充:Hi那老出问题,又不能发送消息了。。。。
你先这样配
applicationContext
<bean id="dataSource"
class="orgspringframeworkjdbcdatasourceDriverManagerDataSource">
<property name="driverClassName">
<value>commicrosoftjdbcsqlserverSQLServerDriver</value>
</property>
<property name="url">
<value>jdbc:sqlserver://localhost:1433;databaseName=mldn</value>
</property>
<property name="username">
<value>sa</value>
</property>
<property name="password">
<value>sa</value>
</property>
</bean>
然后写个测试类:
ApplicationContext ac =
new ClassPathXmlApplicationContext("applicationContextxml");
BeanName bean= (BeanName) acgetBean("beanid");
这样测试异常会提示的更加明确 就可以找到问题所在了
你这是TOMCAT的写法,WAS的JNDI不是这样的:java:/comp/env/jdbc/cib_ds
如下编写就可以了:
Hashtable env = new Hashtable();
envput(ContextINITIAL_CONTEXT_FACTORY,
"comibmWebspherenamingWsnInitialContextFactory");
InitialContext ctx = new InitialContext(env);
DataSource ds = (DataSource) ctxlookup("jdbc/cib_ds");
以上就是关于怎样查看jndi连接池资源个数全部的内容,包括:怎样查看jndi连接池资源个数、JDBC与JNDI这两种连接方式有什么区别、weblogic部署中数据源的JNDI是什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)