java.net.ConnectException: Connection refused (Con

2019-09-15 03:46发布

问题:

This question is an exact duplicate of:

  • AWS RDS How to set up a MySQL Database 1 answer

I have an AWS Elastic Beanstalk instance with Tomcat running a Java RESTful service installed.

I then also have a MySQL database instance set up on AWS-RDS.

I have the following active security group that allows all inbound and outbound traffic.

I am able to connect to the database with MySQL Workbench:

Which suggests the Database is okay. So I think the issue is with my Java code.

After reading this, I set up the following datasource in my Hibernate Configuration (the commented coded works on OpenShift servers).

    @Bean
    public DataSource dataSource() {
        // Openshift
//      String host = System.getenv("OPENSHIFT_MYSQL_DB_HOST");
//      String port = System.getenv("OPENSHIFT_MYSQL_DB_PORT");
//      String username = System.getenv("OPENSHIFT_MYSQL_DB_USERNAME");
//      String password = System.getenv("OPENSHIFT_MYSQL_DB_PASSWORD");

        // AWS
        String host = System.getenv("RDS_HOSTNAME");
        String port = System.getenv("RDS_PORT");
        String username = System.getenv("RDS_USERNAME");
        String password = System.getenv("RDS_PASSWORD");
        String dbname = System.getenv("RDS_DB_NAME");

        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName")); // jdbc.driverClassName=com.mysql.jdbc.Driver
        if (host == null) {
            dataSource.setUrl(environment.getRequiredProperty("jdbc.url")); 
            dataSource.setUsername(environment.getRequiredProperty("jdbc.username"));
            dataSource.setPassword(environment.getRequiredProperty("jdbc.password"));
        } else {
            //dataSource.setUrl("jdbc:mysql://" + host + ":" + port + "/");
            // Openshift
            //dataSource.setUrl("jdbc:mysql://" + host + ":" + port + "/" + environment.getRequiredProperty("jdbc.dbname"));
            // AWS
            dataSource.setUrl("jdbc:mysql://" + host + ":" + port + "/" + dbname);
            dataSource.setUsername(username);
            dataSource.setPassword(password);
            System.out.println("jdbc:mysql://" + host + ":" + port + "/" + dbname+", username: "+username+", password: "+password);
        }

        return dataSource;
    }

However, when I try access a RESTful Service, I get the following:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982)
org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection
    org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:431)
org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
java.net.ConnectException: Connection refused (Connection refused)

回答1:

Solution:

Need to use System.getProperty and not System.getenv.

    String host = System.getProperty("RDS_HOSTNAME");
    String port = System.getProperty("RDS_PORT");
    String username = System.getProperty("RDS_USERNAME");
    String password = System.getProperty("RDS_PASSWORD");
    String dbname = System.getProperty("RDS_DB_NAME");

The Java service now connects to the database.