Я новичок в JDBC. Я установил GlassFish 3.1.1 на Centos 6.2 и должен использовать его с приложением, которое подключается к базе данных Oracle 11G на другом сервере. Я прочитал документацию для GlassFish и думаю, что понимаю, как создать пул соединений JDBC, а также ресурс JDBC. Мой вопрос: как использовать эту информацию при кодировании среднего уровня java для подключения к базе данных?Как изменить код Java для доступа к базе данных с помощью JDBC после создания пула соединений JDBC в GlassFish?
В настоящее время (только с установкой GlassFish и без конфигурации JDBC), я полагаюсь на переменные окружения CentOS для Java (например, CLASSPATH), чтобы веб-приложение могло использовать драйверы JDBC. Тем не менее, я получаю следующее сообщение об ошибке:
java.lang.NoClassDefFoundError: oracle/jdbc/pool/OracleDataSource
Таким образом, моя попытка создать пул соединений JDBC и ресурсы в GlassFish (так что приложение может использовать драйвер 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 Connection Pool (с именем: myPool) и ресурс JDBC (с именем: myDBPool)? Если это имеет значение, я использую Oracle 11.2, CentOS 6.2, GlassFish 3.1.1 с mod_jk и с веб-сервером Apache 2.2 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");
^
UPDATE 2: Я очистил тех, компилировать ошибки, используя комментарии Кирилла ниже (чтобы исключить все исключения). Затем я создал JDBC Connection Pool и JDBC Resource, а 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, если вы его не развертываете. –