2016-04-24 96 views
1

試圖連接到MySQL數據庫我有此錯誤:通過GlassFish的連接池連接到MySQL

No object bound to name java:comp/env/jdbc/mySql

這是我的配置類:

@Configuration 
@EnableTransactionManagement 
@ComponentScan({ "org.onmyown.config" }) 
@PropertySource(value = { "classpath:application.properties" }) 
public class HibernateConfiguration { 

@Autowired 
private Environment environment; 

@Bean 
public LocalSessionFactoryBean sessionFactory() { 
    LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); 
    sessionFactory.setDataSource(dataSource()); 
    sessionFactory.setPackagesToScan(new String[] { "org.onmyown" }); 
    sessionFactory.setHibernateProperties(hibernateProperties()); 
    return sessionFactory; 
} 

@Bean 
public DataSource dataSource() { 
    DataSource dataSource = null; 
    try { 
     Context initialContext = new InitialContext(); 
     Context environmentContext = (Context)initialContext.lookup("java:comp/env"); 
     dataSource = (DataSource) environmentContext.lookup("jdbc/mySql"); 
    } catch (NamingException e) { 
     e.printStackTrace(); 
    } 
    return dataSource; 
} 

private Properties hibernateProperties() { 
    Properties properties = new Properties(); 
    properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect")); 
    properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql")); 
    properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql")); 
    properties.put("hibernate.hbm2ddl.auto", environment.getRequiredProperty("hibernate.hbm2ddl.auto")); 
    return properties; 
} 

@Bean 
@Autowired 
public HibernateTransactionManager transactionManager(SessionFactory s) { 
    HibernateTransactionManager txManager = new HibernateTransactionManager(); 
    txManager.setSessionFactory(s); 
    return txManager; 
} 
} 

我可以平安GlassFish很好。我把所有我需要的財產(我認爲)。我的朋友使用Derby數據庫進行了這種配置,它的工作原理。有什麼區別嗎?

@edit

我「固定」了一些東西。我加的web.xml,一切就在這裏:現在

https://github.com/afterlook/SpringMVC

的問題是,應用程序並不真正關心,我把MySQL作爲數據源。它搜索這是GlassFish中默認設置之一的DerbyPool。任何想法爲什麼?

+0

閱讀有關[上下文的環境(https://docs.oracle.com/javase/jndi/tutorial/beyond/env/context.html),你必須先設置它才能得到它...這是一個[示例](https://docs.oracle.com/javase/jndi/tutorial/beyond/env/src/GetEnv.java) –

+0

我不明白它,你是否想說我在hibernateProperties()中返回的屬性是空的?如果是的話,情況並非如此。我已經閱讀了你鏈接的這些例子,我不知道這應該如何幫助我。讓我也指出,當我沒有使用代碼的連接池時,我的應用程序工作正常。我改變的唯一的東西是dataSource()。 – Afterlook

回答

1

您發佈的originaly問題會嘗試使用使用JNDI和關鍵字comp/env/jdbc/mySql查找的數據源,但未配置。

如果你想使用Glasfish的連接池,您必須配置Glasfish所以它創建一個游泳池和出版它作爲重點comp/env的/ JDBC一個JNDI組件/ MySQL的 mysql glasfish顯示了這是如何實現的。

隨着您的修復,您將JNDI代碼註釋掉了,而是從屬性中設置連接URL。

db.url=jdbc:mysql://localhost:3306/app 

沒有額外的配置,這似乎指向使用德比db的Glasfish默認連接池。

如果你想使用Glasfish連接池:

  1. 配置Glasfish到箱子是池作爲鏈接的文檔中描述的用mysql。
  2. 您將爲Glsfish連接池配置url,user,password,所以我認爲您不必在spring配置中再次提供它。從JNDI查找中獲取數據源。
  3. 恢復註釋掉JNDI查找的修復。 您的代碼應該是這樣的:

    @Bean 
        public DataSource dataSource() { 
        DataSource dataSource = null; 
        try { 
         Context initialContext = new InitialContext(); 
         Context environmentContext = (Context)initialContext.lookup("java:comp/env"); 
         dataSource = (DataSource) environmentContext.lookup("jdbc/mySql"); 
        } catch (NamingException e) { 
         e.printStackTrace(); 
        }*/ 
        return dataSource; 
    } 
    
+0

非常感謝。這個文檔是我的問題的一個很好的起點。在路上我遇到了一些小問題,但沒有什麼太難應付我自己。如果有人在同一個問題上出現問題,那麼回購現在就要做日期來查找變化。 – Afterlook

+0

而這個修復是關於web.xml的。我一直在用JNDI查找來運行我的應用程序。我不知道我爲什麼在推動回購之前評論它。 – Afterlook