我正在编写一个应用程序,该应用程序必须可配置为连接到 Oracle、SQL Server 和 MySQL,具体取决于客户端的突发奇想。
到目前为止,我一直在计划使用 JDBC-ODBC 桥并使用不同的连接字符串连接到数据库。
我被告知这不是很有效。
是否有连接到多个数据库系统的模式或最佳实践?或者选择使用哪个驱动程序?
我应该配置它吗?但包括所有三个驱动程序或构建三个单独的客户端?
我没有做任何复杂的事情,只是将数据从事件流中泵入(插入)到数据库中。
我建议您将其配置为可配置并包含三个驱动程序。您可以使用这样的模式:创建一个提供连接到数据库的功能的超类(我们称之为 DAO)。这可能是抽象的。
为您希望连接的每种类型的数据库创建一个具体的子类。因此,您最终可能会使用 MySQLDAO、MSSQLDAO 和 OracleDAO。每个都将加载各自的驱动程序并使用其各自的连接字符串。
使用 getDAO(DB) 方法创建另一个类(我们称之为 DAOFactory),该方法将根据 DB 的值创建 DAO 的实例。
例如(在伪代码中):
if(DB.equals("MySQL")){
DAO = new MySQLDAO();
}
return DAO;
所以任何需要连接到数据库的代码都会调用 DAOFactory 并请求一个 DAO 实例。您可以将 DB 值存储在外部文件(如属性文件)中,这样您就不必修改代码来更改数据库的类型。
这样你的代码就不需要知道它连接到哪种类型的数据库,如果你决定以后支持第四种类型的数据库,你将不得不再添加一个类并修改 DAOFactory,而不是你的代码的其余部分。
如果您需要任何复杂的东西,Hibernate 是一个不错的选择。
否则,我要做的是将您的连接详细信息存储在属性文件(或某种其他形式的配置)中 - 即:驱动程序类名、JDBC url、用户名和密码。
然后,您需要做的就是从您的属性文件中加载连接详细信息并在您的类路径中包含正确的 JAR 文件,然后您就完成了。
如果您希望配置更容易一些,您可以使用诸如 Commons-DBCP 之类的库,但除此之外,这就是您需要做的所有事情(当然,前提是您的 SQL 语句适用于每个数据库)。
如果您小心(并且您进行了测试),您可以使用直接的 JDBC 来执行此操作,并且只需更改驱动程序类和连接信息。您肯定希望远离 JDBC-ODBC 桥,因为它通常很慢且不可靠。与 JDBC 相比,桥跨 dbs 的行为更有可能不同。
如果您的要求像列出的那样简单,我认为 DAO 路径是矫枉过正的。
如果您正在执行大量插入操作,您可能需要调查准备好的语句和批量更新,因为它们的效率要高得多。这可能最终会变得不那么便携——如果没有测试就很难说。
看看数据源。这是获取数据库连接的首选机制。
IMO 这为管理员选择数据库、连接池和事务策略提供了最大的灵活性。
如果您使用的是 tomcat,请参阅此处了解如何使用 tomcat 的 JNDI 注册数据源。
如果您使用的是 Spring,那么您可以使用jee:jndi-lookup
.
如果您使用 Spring,但不想使用 JNDI,请查看 DriverManagerDataSource以讨论如何获取池化数据源(DBCP 或 C3P0)。