Только что завершил проект, который сделал это, используя Derby с Hibernate, пару дней назад. (Дерби работает в той же JVM.)
Насколько я понимаю, когда вы используете встроенный драйвер, он по умолчанию запускает экземпляр базы данных как часть драйвера и до тех пор, пока вы зависаете в соединении, в котором работает база данных. Но для Hibernate ему нравится иметь DataSource
, который должен быть источником пула данных.
Приведенный выше ответ верен, неплохо было бы запустить Derby в качестве сервера сетевой БД, даже если вы используете ту же JVM. Вы по-прежнему можете использовать встроенный драйвер JDBC, который, кажется, знает, когда база данных, к которой вы подключаетесь, находится в режиме сети, и настраивается соответствующим образом. (Это также позволяет использовать сторонний инструмент для подключения к базе данных и просмотра и редактирования данных и схемы во время ее работы, что очень удобно для отладки.)
System.setProperty("derby.system.home", applicationHome);
NetworkServerControl serverControl = new NetworkServerControl(InetAddress.getByName(m_address),port);
serverControl.start(new PrintWriter(System.out, true));
Когда база данных запущена, вы помещаете экземпляр DataSource
в реестр JNDI. Затем Hibernate может получить доступ к этому источнику данных, учитывая его имя, из реестра JNDI.
EmbeddedConnectionPoolDataSource40 dataSource = new EmbeddedConnectionPoolDataSource40();
dataSource.setDatabaseName(databaseName);
dataSource.setUser(username);
dataSource.setPassword(password);
EmbeddedConnectionPoolDataSource40
- это реализация DataSource для использования с пулом DataSource, поэтому соединения можно использовать, где это возможно. Я использовал Apache Commons DBCP и изменил один из примеров , чтобы создать свой собственный источник данных пула с помощью EmbeddedConnectionPoolDataSource40.