2012-02-26 1 views
1

Я новичок в 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 (?). Надеюсь, кто-то сможет это объяснить.

+0

Причина, по которой вы получаете эту ошибку, заключается в том, что вы не развертываете драйвер JDBC, а также не являетесь частью драйвера JDBC пути класса контейнера. В любом случае использование JNDI - лучшая идея, но не волшебство позволит вам использовать драйвер JDBC, если вы его не развертываете. –

ответ

2

У вас работает пул связи? Если нет, то проверьте конфигурацию пула ж/http://docs.oracle.com/cd/E18930_01/html/821-2416/beamw.html#beanh

После пинги работы и ресурсы JDBC настроены, вы должны быть в состоянии получить доступ к нему в коде приложения через JNDI:

InitialContext context = new InitialContext(); 
DataSource ds = (DataSource) context.lookup("jdbc/myDBPool"); // or whatever name you used when creating the resource 
conn = ds.getConnection(); 

Надеется, что это помогает,

ОТВЕТ НА ОБНОВЛЕНИЕ 1: Это просто компилятор, сообщающий вам официально уловить или объявить проверенное исключение, которое может быть выбрано JNDI. Для целей тестирования, самый простой выход из этого (и будущих ошибок, как это), чтобы просто расширить свой метод подписи, чтобы бросить все исключения, то есть:

public static void main(String args[]) throws /*SQL*/Exception { 

ОТВЕТ НА ОБНОВЛЕНИЕ 2: Там нет причин, чтобы бросить Интерфейсы JDBC относятся к реализациям Oracle, если вам не требуется доступ к любой настраиваемой функции, не указанной в спецификации JDBC. Цель DataSource - быть фабрикой для Connections, API которой определен в интерфейсе JDBC, так что это должно быть все, что вам нужно. Когда вы определяете пул подключений и ресурс в GlassFish, сервер приложений добавляет значение, обертывая классы драйверов JDBC и беспрепятственно проксимизируя их для вас, пока вы пытаетесь импортировать java.sql. *. Нет необходимости в импорте оракула :) Главное преимущество заключается в том, что если вы когда-нибудь захотите переключиться на MySQL или какое-то другое хранилище данных, ваш код будет переносимым и не нуждается в каких-либо изменениях.

+0

Спасибо за сообщение об обновлении 1. С вашей рекомендацией он сейчас компилируется. Спасибо, Кирилл! См. Обновление 2 выше. – ggkmath

1

Чтобы добавить хороший ответ Кирилловской:

Вместо JNDI поиска, вы также можете использовать инъекции ресурсов настроить ваш DataSource:

@Resource(name = "jdbc/Your_DB_Res") 
private DataSource ds; 

При запуске сервер приложений будет затем введите источник JDBC. This section учебного пособия по Java EE больше по этому вопросу.

При использовании впрыска ресурсов вы можете уменьшить количество кода шаблона. This article вводит понятия.

+0

Спасибо TPete. Есть ли какие-либо существенные плюсы или минусы в одном направлении над другим? – ggkmath

+0

@ggkmath Отредактировал мой ответ со ссылкой на введение в инъекцию ресурсов. – TPete

0

Помимо добавления драйвера в ваш путь к классу, попробуйте добавить файл appserv-rt.jar в путь сборки проекта (jar находится в каталоге библиотеки Glassfish). Если вы не хотите включать все другие банки, сначала создайте библиотеку, содержащую баннер appserv-rt, а затем добавьте ее в путь сборки проекта.

Смежные вопросы