我正在寻找一种方法,如果我的Dropwizard应用程序启动时它不存在,我可以检查并创建一个PostgreSQL数据库。我正在使用多个数据库,因此我们选择使用私有模块加载所有连接和持久性单元。我已经看过使用JDBI,但这似乎打破了我们想要使用私有模块的方法。我也读过使用Dropwizard Migrations但看起来很像xml很重,这是我想要避免的。
如果我从一个已经建立的空白数据库开始,Hibernate会很好地创建我的模式,所以我唯一缺少的部分是如果数据库不存在则会自动创建数据库。
感谢任何帮助!
答案 0 :(得分:0)
我必须至少拥有一个静态的连接。例如。如果您的数据库是:
jdbc:mysql://localhost:3306/X
jdbc:mysql://localhost:3306/Y
然后你必须与
建立联系jdbc:mysql://localhost:3306/
在您的启动代码中,您需要手动检查是否存在所有数据库,如果不存在则创建它们。之后,您可以加载其余的持久性上下文。
例如,有关如何使用纯jdbc
执行此操作的快速代码段public class DBTest {
public static DataSource datasource() {
MysqlDataSource ds = new MysqlDataSource();
ds.setUrl("jdbc:mysql://localhost/?"
+ "user=root");
return ds;
}
public static void main(String[] args) throws SQLException {
DataSource datasource = datasource();
ResultSet executeQuery = datasource.getConnection().createStatement().executeQuery("Show databases;");
List<String> tables = new ArrayList<>();
while(executeQuery.next()) {
tables.add(executeQuery.getString(1));
}
if(!tables.contains("MyNewDB")) {
datasource.getConnection().createStatement().execute("Create database MyNewDB;");
}
}
}
编辑:
正如所指出的,上面是一个mysql解决方案。我安装了postgres并进行了快速调整,所以这对我来说适用于postgres。主要问题是,没有&#34;显示数据库&#34;对于postgres。替换它(和连接等)修复了这个问题。工作原理相同:
public static void main(String[] args) throws SQLException, ClassNotFoundException {
Class.forName("org.postgresql.Driver");
Connection connection = null;
connection = DriverManager.getConnection(
"jdbc:postgresql://localhost:5432/","artur", "");
ResultSet executeQuery = connection.createStatement().executeQuery("SELECT datname FROM pg_database;");
List<String> tables = new ArrayList<>();
while(executeQuery.next()) {
tables.add(executeQuery.getString(1));
}
if(!tables.contains("MyNewDB")) {
connection.createStatement().execute("Create database MyNewDB;");
}
connection.close();
}
另请注意,应正确处理jdbc部分(处理连接等)。它给出了正确的想法,我希望:)