怎样查看jndi连接池资源个数

怎样查看jndi连接池资源个数,第1张

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是什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9475876.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存