Как мне реализовать getConnection () в DataSource в Java? - PullRequest
3 голосов
/ 02 ноября 2010

Я читаю на DataSource, здесь , и пытаюсь реализовать его в своем собственном небольшом проекте, используя простой файл в качестве моего "источника данных". Я создал класс, который на данный момент довольно прост ...

public class QueueData implements DataSource { ... }

хотя причина этого проста в том, что я не смог найти ресурс, который объясняет, как должны работать реализованные методы. Кажется, что каждый просто перечисляет инициализацию контекста и магический вызов getConnection (), вот так.

    Context ctx = new InitialContext(env1);
    DataSource ds = (DataSource)ctx.lookup("jdbc/mydatasource");
    Connection conn = ds.getConnection(); // Magical method!

Но может ли кто-нибудь из вас привести пример того, как должен выглядеть код внутри getConnection ()?

Ответы [ 3 ]

3 голосов
/ 02 ноября 2010

Причина, по которой никто не показывает примеры того, как реализовать DataSource, а "просто" использует их вместо этого, заключается в том, что только поставщики драйверов JDBC (обычно производители баз данных) должны писать их.

Что он должен делать, это, конечно,вернуть объект Connection, который также должен быть экземпляром класса драйвера.В вашем случае, что-то, что может принимать операторы SQL для чтения из файла.

Ваш код может выглядеть примерно так:

 public Connection getConnection(){
      final String fileName = getFileNameFromMyDatabaseUrl();
      return new MyFileConnection(new File(fileName));
 }

Что, конечно, тоже не очень интересный код.

Вы можете посмотреть на некоторые реализации DataSource с открытым исходным кодом, чтобы увидеть, что они делают:

  • Apache Commons DBCP PoolingDataSource (пул соединений)
  • Apache Derby's EmbeddedDataSource (встроенная база данных, написанная на Java)
  • Postgresql's BaseDataSource (абстрактный базовый класс для драйвера JDBC Postgresql)
2 голосов
/ 02 ноября 2010

Это не волшебство. Вы извлекаете объект DataSource, который был связан с сервером JNDI, обычно при настройке пула соединений на сервере приложений. Эта настройка требует, чтобы вы предоставили все необходимые данные базы данных, такие как URL-адрес подключения, учетные данные для аутентификации и другие параметры, такие как класс DataSource для этой конкретной базы данных (которая присутствует в драйвере jdbc, который входит в эту базу данных). Эта информация о настройке используется для создания DataSource, который знает, как раздавать соединение для данной базы данных.

Допустим, вы хотите написать собственную реализацию, которая дает клиенту соединение NOOP (объект соединения, для которого все операции ничего не дают). Все, что вам нужно сделать, это «зарегистрировать» пользовательскую реализацию DataSource на сервере приложений JNDI. Метод getConnection() этой реализации просто возвращает класс, который реализует интерфейс Connection, и методы, которые ничего не делают.

2 голосов
/ 02 ноября 2010

Connection вполне уверен в самом интерфейсе, который вам также потребуется реализовать. Затем ваш getConnection() вернет экземпляр вашего собственного класса. Тем не менее, будьте готовы к большой работе ... (например, если вы хотите иметь возможность получить источник данных в контексте, вам сначала нужно зарегистрировать свою реализацию.)

Почему вы хотите разработать свой собственный источник данных? В Интернете есть очень легкие библиотеки баз данных на основе файлов и в процессе (хотя я должен признать, что я не знаю их слишком хорошо), например, HSQLDB ( статья в Википедии ), H2 ( Wiki ) ...

Если бы вы разрабатывали на C #, я бы также рекомендовал изучить Linq To XML, но я не знаю, придумал ли в мире Java аналог для этого ...

...