我正在尝试在openshift上部署我的Jersey项目。我已经实现了这个apple类来测试另一个类中的错误,因为我猜问题是建立数据库连接。在Tails日志中我发现了这个错误:
连接数据库 - com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:由于基础异常,无法加载连接类:'java.lang.NumberFormatException:对于输入字符串:“OPENSHIFT_MYSQL_DB_PORT”'。 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
package org.busTracker.serverSide;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
/**
* Root resource (exposed at "myresource" path)
*/
@Path("myresource")
public class Apple {
//I modified my credients.
String host = "jdbc:mysql://$OPENSHIFT_MYSQL_DB_HOST:OPENSHIFT_MYSQL_DB_PORT/serverside";
String user = "adminBjv5a4k";
String password = "7tvPb1Bx3v8j";
/**
* Method handling HTTP GET requests. The returned object will be sent
* to the client as "text/plain" media type.
*
* @return String that will be returned as a text/plain response.
*/
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getIt() {
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
System.out.println("Connecting to database…");
conn = DriverManager.getConnection(host,user,password);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
// ignore
}
}
}
return "Hello, from apple class 14.05.15 11:35!";
}
}
编辑:我在DriverManager.getConnection()之后将以下内容添加到了try块:
Map<String, String> env = System.getenv();
for (String envName : env.keySet()) {
System.out.format("%s=%s%n",
envName,
env.get(envName));
}
我尝试过以下但我仍然遇到同样的错误:
答案 0 :(得分:3)
问题是因为这一行
String host = "jdbc:mysql://$OPENSHIFT_MYSQL_DB_HOST:OPENSHIFT_MYSQL_DB_PORT/serverside";
要获取环境变量,您需要使用方法System.getEnv().get("[the variable name]")
。因此,在您的情况下,主变量应该如下所示
String host = "jdbc:mysql://"
+ System.getenv().get("OPENSHIFT_MYSQL_DB_HOST")
+ ":"
+ System.getenv().get("OPENSHIFT_MYSQL_DB_PORT")
+ "/serverside";
顺便说一下,你的编辑不起作用,因为应用程序在执行代码之前已经抛出异常。所以,为了使其有效,您需要将 before
设为DriverManager.getConnection()
函数。
答案 1 :(得分:0)
您可以将这些变量替换为以下内容。
<property name="url"
value="jdbc:mysql://$OPENSHIFT_MYSQL_DB_HOST:$OPENSHIFT_MYSQL_DB_PORT/
yourdatabasename" />
can be replaced as below.
<property name="url"
value="jdbc:mysql://127.12.97.2:3306/yourdatabasename"
/>
jdbc:mysql://127.12.97.2:3306 / yourdatabasename“可以从openshift phpmyadmin页面获取IP地址和端口号,它们通常显示在管理页面的顶部。
答案 2 :(得分:0)
我尝试了以上所有解决方案,但它没有解决我的问题。所以任何人仍然得到这个例外,试试这个。 存储在环境变量 $ OPENSHIFT_MYSQL_DB_HOST 中的值类似于
'JDBC:MySQL的:// adminuname:adminpass@127.02.0.1:3306 /应用程序的名字'
。因此,使用该值为DriverManager.getConnection()创建url会给我们提供异常。 而是尝试知道存储在 $ OPENSHIFT_MYSQL_DB_HOST 中的值,然后将URL硬编码为没有该用户名和密码的String变量。像这样的东西
'JDBC:MySQL的://127.02.0.1:3306 /应用程序的名字'
对我而言,它在进行此修改后开始工作。所有其他环境变量都可以按原样使用。