【问题标题】:JTA Datasource java configuration in springSpring中的JTA Datasource java配置
【发布时间】:2015-01-20 11:10:58
【问题描述】:

所以在过去的几天里,我一直在尝试使用 spring 配置 JTA 数据源,但是无论我使用多少 hpw,我都无法找到如何做到这一点。

这是我当前的数据源配置,但这是本地数据源配置

    @Bean
    public DataSource dataSource() {
        final BasicDataSource dataSource = new BasicDataSource();
        dataSource.setUrl("jdbc:mysql://localhost:3306/expenses");
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        return dataSource;
    }

这是我的 jboss 8 的standalone.xml 中我的数据源的配置:

 <datasource jndi-name="java:/ExpensesDataSource" pool-name="ExpensesDataSourcePool" enabled="true" use-java-context="true">
                    <connection-url>jdbc:mysql://localhost:3306/expenses</connection-url>
                    <driver>mysql</driver>
                    <security>
                        <user-name>root</user-name>
                        <password>root</password>
                    </security>
                </datasource>

显然现在我有双重代码,因为我晚上不使用我的 jboss 的数据源。我想通过 jndi 查找配置我的 jta 数据源以使用此数据源。

编辑#2:

所以最终我找到了这段代码:

@Bean
    public DataSource dataSource() {
        JndiDataSourceLookup jndiDataSourceLookup = new JndiDataSourceLookup();
        return jndiDataSourceLookup.getDataSource("java:/ExpensesDataSource");
    }

但是,这给了我以下堆栈跟踪:

Caused by: org.springframework.jdbc.datasource.lookup.DataSourceLookupFailureException: Failed to look up JNDI DataSource with name 'java:/ExpensesDataSource'; nested exception is javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial

编辑#2:

我环顾了一下,发现我需要设置一些初始环境参数,得到这个:

Properties jndiProperties = new Properties();
        jndiProperties.setProperty(Context.PROVIDER_URL, "jnp://localhost:1099");
        jndiProperties.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
        jndiProperties.put("java.naming.factory.url.pkgs", "org.jboss.naming.org.jnp.interfaces");
        JndiDataSourceLookup jndiDataSourceLookup = new JndiDataSourceLookup();
        jndiDataSourceLookup.setJndiEnvironment(jndiProperties);
        return jndiDataSourceLookup.getDataSource("java:global/ExpensesDataSource");

我尝试将localhostlocalhost:1099http://localhost:1099 设置为Context.PROVIDER_URL,但它们都不起作用,包括这个。给我以下错误:

Caused by: javax.naming.CommunicationException: Failed to connect to server localhost:1099 [Root exception is javax.naming.ServiceUnavailableException: Failed to connect to server localhost:1099 [Root exception is java.net.ConnectException: Connection refused: connect]]
    at org.jnp.interfaces.NamingContext.getServer(NamingContext.java:274)
    at org.jnp.interfaces.NamingContext.checkRef(NamingContext.java:1533)
    ... 96 more
Caused by: javax.naming.ServiceUnavailableException: Failed to connect to server localhost:1099 [Root exception is java.net.ConnectException: Connection refused: connect]
    at org.jnp.interfaces.NamingContext.getServer(NamingContext.java:248)
    ... 97 more
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at java.net.Socket.connect(Socket.java:538)
    at java.net.Socket.<init>(Socket.java:434)
    at java.net.Socket.<init>(Socket.java:328)
    at org.jnp.interfaces.TimedSocketFactory.createSocket(TimedSocketFactory.java:84)
    at org.jnp.interfaces.TimedSocketFactory.createSocket(TimedSocketFactory.java:77)
    at org.jnp.interfaces.NamingContext.getServer(NamingContext.java:244)
    ... 97 more

【问题讨论】:

标签: java spring spring-mvc jboss datasource


【解决方案1】:

我看到在 JBOSS 8 中有以下命名空间

  • java:comp
  • java:模块
  • java:app
  • java:global
  • java:jboss
  • java:/

所以在你的spring应用中放

<jee:jndi-lookup id="datasource" jndi-name="java:global/ExpensesDataSource"></jee:jndi-lookup>

@Bean
public DataSource dataSource() {
    JndiDataSourceLookup jndiDataSourceLookup = new JndiDataSourceLookup();
    return jndiDataSourceLookup.getDataSource("java:global/ExpensesDataSource");
}

在你的standalone.xml 配置中尝试遵循这个snippet

【讨论】:

  • 嘿,我阅读了文档,我认为我不需要在我的 jboss 中做任何额外的配置
  • 也许不是。您应该在查找中看到该名称。我怎么说你有 6 个表格来引用上面指定的 JNDI 名称。
  • 我查找的名称是 java:/ExpensesDataSource
  • 你在做 java:/ExpensesDataSource。试试 java:global/ExpensesDataSource
  • 我相信你使用的是java配置,所以你应该在dataSource()方法中改变你的spring配置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
  • 2021-02-16
  • 1970-01-01
  • 2013-07-06
  • 2014-03-27
相关资源
最近更新 更多