我是JDBC新手。我在Centos 6.2上安装了GlassFish 3.1.1,需要将它与连接到另一台服务器上的Oracle 11G数据库的应用程序一起使用。我已阅读GlassFish的文档,并认为我了解如何创建JDBC连接池以及JDBC资源。我的问题是,如何在编写java中间层连接到数据库时使用这些信息?在GlassFish中创建JDBC连接池后,如何使用JDBC更改Java代码以访问数据库?
目前(仅使用GlassFish安装而没有JDBC配置),我依靠Java的CentOS环境变量(例如CLASSPATH)来允许Web应用程序使用JDBC驱动程序。不过,我发现了以下错误:
java.lang.NoClassDefFoundError: oracle/jdbc/pool/OracleDataSource
因此,我试图创建GlassFish中的JDBC连接池和资源(这样应用程序可以使用JDBC驱动程序)。我的Java文件开始了:
import java.sql.*;
import oracle.jdbc.*;
import oracle.jdbc.pool.OracleDataSource;
class JDBCexample {
public static void main(String args[]) throws SQLException {
Connection conn;
Statement stmt;
ResultSet rset;
String query;
String sqlString;
String person_firstName;
String person_lastName;
String person_email;
int person_salary;
// connect to database
OracleDataSource ds = new OracleDataSource();
ds.setURL("jdbc:oracle:thin:myID/[email protected]:1521:mySID");
conn = ds.getConnection();
// read something in database
stmt = conn.createStatement();
query = "SELECT first_name, last_name, email, salary FROM HR.Employees where rownum < 6";
rset = stmt.executeQuery(query);
while (rset.next()) {
person_firstName = rset.getString("first_name");
person_lastName = rset.getString("last_name");
person_email = rset.getString("email");
person_salary = rset.getInt("salary");
System.out.format(person_firstName + " " + person_lastName + " " + person_email + " %d%n", person_salary)
}
and so on...
问题:如何将改变上面的代码后,我建立一个JDBC连接池(名为:myPool的)和一个JDBC资源(命名为:myDBPool)?如果有问题,我使用Oracle 11.2,CentOS 6.2,GlassFish 3.1.1和mod_jk,并且使用Apache 2.2 webserver JDK 1.6。我没有任何集群或负载平衡。
更新1:我认为this link是一个很好的参考(请参见标题为“创建数据源实例,注册JNDI和连接”一节)。但是,当我修改上面的Java文件,如下所示(只是准备java文件,还没有触及的GlassFish还),
// Add These:
import javax.naming.Context;
import javax.naming.InitialContext;
// Change from this:
// connect to database
OracleDataSource ds = new OracleDataSource();
ds.setURL("jdbc:oracle:thin:myID/[email protected]:1521:mySID");
conn = ds.getConnection();
// To this:
// connect to database
Context ctext = new InitialContext();
OracleDataSource ds = (OracleDataSource)ctext.lookup("jdbc/myDBPool");
conn = ds.getConnection();
我得到的错误:
JitterClass.java:67: unreported exception javax.naming.NamingException; must be caught or declared to be thrown
Context ctext = new InitialContext();
^
JitterClass.java:68: unreported exception javax.naming.NamingException; must be caught or declared to be thrown
OracleDataSource ds = (OracleDataSource)ctext.lookup("jdbc/myDBPool");
^
更新2:我清除那些使用下面的cyril的注释编译错误(抛出所有例外)。然后我创建了JDBC连接池和JDBC资源,并且Ping成功。于是我从客户端运行的应用程序,并遵守下列错误:
java.lang.ClassCastException : com.sun.gjc.spi.jdbc40.DataSource40 cannot be cast to oracle.jdbc.pool.OracleDataSource
在这一点上,如果我添加了include javax.sql.DataSource
到程序,并更改该行:
OracleDataSource ds = (OracleDataSource)ctext.lookup("jdbc/myDBPool");
成为本line:
DataSource ds = (DataSource)ctext.lookup("jdbc/myDBPool");
它编译没有错误。但是现在我感到困惑......我们是不是应该在这里使用OracleDataSource?或者,GlassFish以某种方式实现OracleDataSource,因为我看到Datasource Classname
设置为oracle.jdbc.pool.OracleDataSource
(?)的连接池的设置。希望有人能解释这一点。
您得到该错误的原因是因为您没有部署JDBC驱动程序,JDBC驱动程序也不是容器类路径的一部分。无论如何,使用JNDI是一个更好的主意,但如果不部署它,它并不会让你使用JDBC驱动程序。 – 2012-02-26 23:44:55