有时候数据库的密码并不能让所有人知道,为此我们可以提供JNDI访问方式,让编码者来获取,
一: 针对JBoss服务器,客户端获取方式如下:
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Context ctx = null;
Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
p.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
p.put(Context.PROVIDER_URL, "jnp://192.168.70.11:1199");
try {
ctx = new InitialContext(p);
// javax.sql.DataSource ds = (javax.sql.DataSource) ctx.lookup("java:comp/env/jdbc/CbsDS");
javax.sql.DataSource ds = (javax.sql.DataSource) ctx.lookup("DS");
// NamingEnumeration<?> list =((Context) ctx.lookup("DS")).listBindings("");
// while (list.hasMore()) {
// Binding b =(Binding)list.next();
// System.out.println(b.getName());
// }
System.out.println(ds==null?"NULL":ds.toString());
try {
Connection connect =ds.getConnection();
Statement st=connect.createStatement();
String sql="select * from *** d ";
ResultSet rs=st.executeQuery(sql);
if(rs.next()) {
System.out.println(rs.getString("username"));
}else {
System.out.println("no data");
}
rs.close();
st.close();
connect.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
二: 针对不同的应用服务器,客户端要用不同的连接方式,收集整理如下:
各种服务器中的JNDI设置以方法
WebSphere
Properties properties= new Properties();
properties.put(javax.naming.Context.PROVIDER_URL,"iiop:///"); properties.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY,"com.ibm.ejs.ns.jndi.CNInitialContextFactory");
new InitialContext(properties);
JBoss
Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
p.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
p.put(Context.PROVIDER_URL, "jnp://localhost:1099");
InitialContext ctx = new InitialContext(p);
SUN
Properties props = new Properties();
props.setProperty( "java.naming.factory.initial" ,"com.sun.enterprise.naming.SerialInitContextFactory" );
props.setProperty( "java.naming.provider.url" , "localhost:3700" );
InitialContext = new InitialContext(props);
Weblogic10
Properties props = new Properties();
props.setProperty( "java.naming.factory.initial" , "weblogic.jndi.WLInitialContextFactory" );
props.setProperty( "java.naming.provider.url" , "t3://localhost:7001" );
InitialContext = new InitialContext(props);
三: 至于应用服务器的设置方法,每个都不相同,现只列出JBoss下的Oracle 设置方式:
文件目录是jboss安装目录下的: deploy/oracle-ds.xml
<local-tx-datasource>
<jndi-name>DS</jndi-name>
<use-java-context>false</use-java-context>
<connection-url>jdbc:oracle:thin:@your ip:1521:your servise name</connection-url>
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<!-- Uses the pingDatabase method to check a connection is still valid before handing it out from the pool -->
<!--valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker</valid-connection-checker-class-name-->
<min-pool-size>1</min-pool-size>
<max-pool-size>2</max-pool-size>
<!-- Checks the Oracle error codes and messages for fatal errors -->
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
<!-- sql to call when connection is created
<new-connection-sql>some arbitrary sql</new-connection-sql>
-->
<!-- sql to call on an existing pooled connection when it is obtained from pool - the OracleValidConnectionChecker is prefered
<check-valid-connection-sql>some arbitrary sql</check-valid-connection-sql>
-->
<!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml -->
<security-domain> your db-domain</security-domain>
<metadata>
<type-mapping>Oracle11g</type-mapping>
</metadata>
</local-tx-datasource>