在运行时 Java EE 7 中设置数据源

Posted

技术标签:

【中文标题】在运行时 Java EE 7 中设置数据源【英文标题】:Setting DataSource in Runtime Java EE 7 【发布时间】:2016-10-01 01:23:04 【问题描述】:

如何动态设置数据源?像下面的春天:

    @Bean(name = "dataSource")
    public DriverManagerDataSource dataSource() 
        DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
        driverManagerDataSource.setDriverClassName("com.mysql.jdbc.Driver");
        driverManagerDataSource.setUrl("jdbc:mysql://localhost:3306/userbase");
        driverManagerDataSource.setUsername("root");
        driverManagerDataSource.setPassword("root");
        return driverManagerDataSource;
    

我可以只将这个功能从 Spring 导入 Java EE 7 企业应用程序吗?

【问题讨论】:

您应该切换到使用数据源而不是数据源管理器。 这篇文章可能对你有所帮助:***.com/questions/13507522/… @MatthewFontana 你指的是docs.oracle.com/javaee/7/api/javax/annotation/sql/… 吗? @PatricioBonilla 抱歉,我只是在说明 Java EE 应用程序您更喜欢直接的数据源而不是驱动程序管理器。您可以在这里找到关于差异的体面讨论:***.com/questions/15198319/… 至于使用哪个数据源,我通常推荐使用 spring 变体。 Spring 极大地简化了 Java EE 开发人员的生活 【参考方案1】:

任何 Java EE 7 实现都将具有定义 javax.sql.DataSource 的工具,该 javax.sql.DataSource 在服务器的 JNDI 目录中具有名称。

您可以使用javax.annotations.Resource 注解在您的应用程序客户端类中注入对它的引用,并使用如下方式:

public class SomeDatabaseClient 

    @Resource("jdbc/myDataSource")
    javax.sql.DataSource myDataSource;

    public void useTheDatabase(String username, String password) 

         try (Connection con = myDataSource.getConnection(username, password);
              PreparedStatement ps = con.prepareStatement(...);
              ResultSet rs = ps.executeQuery() 
              // process the result set
             ...
          catch (SQLException e) 
              // handle errors
         
    

如果您不需要动态指定数据库凭据,可以将它们包含在服务器的 DataSource 定义中。

请注意,安全地管理用户密码并非易事,因此您需要有充分的理由以这种方式使用它们。

如果您需要,您还可以使用相同的代码设置您的 Spring Framework 配置以像这样工作。

【讨论】:

我的印象是 OP 明确想要在 webapp 端而不是在服务器端创建和管理数据源(这确实很奇怪和可疑,但这是他的 Spring sn-p 实际所做的)。 @Steve C,我实际上不想使用框架,只想使用 Java EE 7。这是我企业的要求。原因是为了管理数据库表中的审计信息。你知道触发器 :NEW.[FieldName] := USER; (Oracle) 用户使用其凭据登录。我看到了这个 Spring sn-p,看起来就像我真正想要的功能。或者您知道获得它的最佳方法吗? 上面的解决方案是纯 Java EE - 不需要框架

以上是关于在运行时 Java EE 7 中设置数据源的主要内容,如果未能解决你的问题,请参考以下文章

怎样在程序运行过程中设置临时环境变量

异常:java.lang.Exception:使用主 'yarn' 运行时,必须在环境中设置 HADOOP_CONF_DIR 或 YARN_CONF_DIR。在火花

在xib中设置accessibilityIdentifier nil时,必须从用户定义的运行时属性中设置

我可以在Eclipse Java项目运行配置中设置任意命令吗?

我可以在 Azure 集成运行时警报中设置时间范围吗?

在 JSESSIONID cookie 中设置 httponly (Java EE 5)