前提:
已经配置数据源连接,如其JNDI名称为 MySqlDS,参考:在WebLogic 使用数据源连接池
连接数据源的方法:
1、 使用jsp 页面访问
在WebLogic上部署一个项目,如CodeTest,添加一个jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page import="javax.naming.*" %>
<%@ page import="javax.sql.*" %>
<%@ page import="java.sql.*" %>
<%
String JNDINAME="MySqlDs";
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
String sql = "select * from temp;";
try {
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup(JNDINAME);
conn = ds.getConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
while(rs.next())
{
%>
<%=rs.getInt("id")%>
<%=rs.getString("name")%><br>
<%
}
} catch (NamingException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
finally
{
if(conn!=null)
{
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
在浏览器上中访问该页面:http://localhost:7001/CodeTest/index.jsp
2、如何直接使用JavaProject 里面的一个Class 去访问访问 该数据源呢?
以下都只给出程序的主要代码
1)同jsp,直接使用这三句
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("MySqlDs");
conn = ds.getConnection();
执行结果:
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:662)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:344)
at javax.naming.InitialContext.lookup(InitialContext.java:411)
at SqlDsDemo.queryJNDI(SqlDsDemo.java:23)
at SqlDsDemo.main(SqlDsDemo.java:64)
错误原因:未设置环境变量,因为是直接使用的java代码去访问在WebLogic中的数据源,而上述的jsp访问是已经部署在了WebLogic服务器中
解决方法
final String INIT_FACTORY = "weblogic.jndi.WLInitialContextFactory";
final String SERVER_URL = "t3://localhost:7001";
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, INIT_FACTORY);
props.put(Context.PROVIDER_URL, SERVER_URL);
Context ctx = new InitialContext(props);
2
)在1)的基础上修改后执行
执行结果
can't connect the WebLogic t3://localhost:7001
javax.naming.NoInitialContextException: Cannot instantiate class: weblogic.jndi.WLInitialContextFactory [Root exception is java.lang.ClassNotFoundException: weblogic.jndi.WLInitialContextFactory]
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:674)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307)
at javax.naming.InitialContext.init(InitialContext.java:242)
at javax.naming.InitialContext.<init>(InitialContext.java:216)
at SqlDsDemo.getInitialContext(SqlDsDemo.java:72)
at SqlDsDemo.queryJNDI(SqlDsDemo.java:22)
at SqlDsDemo.main(SqlDsDemo.java:84)
Caused by: java.lang.ClassNotFoundException: weblogic.jndi.WLInitialContextFactory
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:270)
at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:63)
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:671)
... 6 more
Exception in thread "main" java.lang.NullPointerException
at SqlDsDemo.queryJNDI(SqlDsDemo.java:23)
at SqlDsDemo.main(SqlDsDemo.java:84)
错误原因:找不到相关类
解决方法:将 WebLogic\wlserver_12.1\server\lib\weblogic.jar 加入classpath 中
程序中还可能有一下异常:
Exception in thread "main" java.lang.IncompatibleClassChangeError: Implementing class
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:476)
at weblogic.utils.classloaders.GenericClassLoader.findClass(GenericClassLoader.java:181)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:223)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
错误原因:导入了重复的jar包
解决方法:检查一下jar包是否导入错误,jre 是否设置正确
至此,直接使用class 可以成功访问 weblogic 中的数据源了!
总结:直接使用class 访问weblogic中的配置就是两点:①设置环境变量 ② 导入weblogic.jar