我正在开发一个模拟数据立方体及其操作的应用程序。对于这个应用程序,我需要为各种数据库引擎提供支持,如PostgreSQL,MySQL等。 我计划提供一个界面,用户可以选择引擎并指定其详细信息。
我已经能够使用可用的JDBC4驱动程序连接到PostgreSQL。对于这种连接,我必须通过在编译期间在类路径中包含.jar驱动程序来编译我的程序代码。 但作为产品的应用程序应该在JRE上运行,并且不需要重新编译代码。这可能吗?
应用程序还应该可以为数据库可用的较新版本的驱动程序和引擎进行自定义。怎么办呢?
答案 0 :(得分:1)
对于这个连接,我必须通过在编译期间在类路径中包含.jar驱动程序来编译我的程序代码。
你不应该这样做。这实际上是JDBC的重点。您应该将驱动程序类名称(以及连接URL,用户名和/或密码)作为字符串提供,该字符串可以从某些外部配置(属性?)文件中检索。 E.g。
String driverClassName = getItFromConfigurationFileSomehow();
Class.forName(driverClassName);
// ...
更重要的是,由于JDBC4 Class#forName()
根本没有必要。只需将JDBC驱动程序放在运行时类路径中,让ServiceLoader
API自动完成加载驱动程序的工作。
您只需要将代码重写为仅使用java.sql
接口/类(如java.sql.Connection
等)而不是org.postgresql
接口/类,以便您在编译期间不需要JDBC驱动程序。换句话说,您不应该有任何单行代码来导入/引用JDBC驱动程序特定的接口/类。
答案 1 :(得分:1)
您可以通过BalusC提到的反射加载驱动程序类,之后您可以使用DriverManager获取连接。然后你坚持使用java.sql或javax.sql接口,你应该好好去。
如果您打算将此代码用于任何类型的Web应用程序,这种方法将起作用,但它会有严重的缺点。这种方法会干扰应用程序重新加载,这在开发过程中会产生巨大的痛苦。
如果您希望在Web应用程序中使用它,则应该选择从数据源检索数据库连接。这样,Web容器就是实际加载驱动程序的容器,并且您的应用程序不会因为加载驱动程序类而受到惩罚。
您的数据库库代码只需要使用数据源API来检索连接,然后使用java [x] .sql接口来操作数据库。所以它只是检索数据库连接方式的不同。
答案 2 :(得分:0)