Java org.postgresql.util.PSQLException:错误:语法错误位于或接近;";

Java org.postgresql.util.PSQLException:错误:语法错误位于或接近;";,java,sql,heroku,jersey,Java,Sql,Heroku,Jersey,我已经开发了一个Web应用程序,可以由maven eclipse在Heroku上部署 组Id:org.glassfish.jersey.archetypes 工件Id:jersey heroku webapp 版本:2.17 我在本地主机和POSTMAN上测试了该应用程序,效果很好。我将其推送到heroku在servlet容器上进行测试,但我得到520 OK520这只是我在SQLEXCEPTION中返回的一个数字。在heroku日志中,我发现了以下错误: 2015-05-13T13:10:37.

我已经开发了一个Web应用程序,可以由maven eclipse在Heroku上部署

组Id:org.glassfish.jersey.archetypes

工件Id:jersey heroku webapp

版本:2.17

我在本地主机和
POSTMAN
上测试了该应用程序,效果很好。我将其推送到heroku在servlet容器上进行测试,但我得到
520 OK
520这只是我在SQLEXCEPTION中返回的一个数字。在heroku日志中,我发现了以下错误:

2015-05-13T13:10:37.364388+00:00 app[web.1]:    at java.lang.Thread.run(Thread.j
ava:745)
2015-05-13T13:10:37.389547+00:00 app[web.1]: org.postgresql.util.PSQLException:
ERROR: syntax error at or near "("
2015-05-13T13:10:37.389560+00:00 app[web.1]:   Position: 45
2015-05-13T13:10:37.389740+00:00 app[web.1]:    at org.postgresql.core.v3.QueryE
xecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2102)
数据库类:

public class Database {


    public Database() {

    }

    public void drivercConnection() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("jar works :) ");

        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    private static Connection getConnection() throws URISyntaxException, SQLException {

        URI dbUri = new URI(System.getenv("DATABASE_URL"));
        String username = dbUri.getUserInfo().split(":")[0];
        String password = dbUri.getUserInfo().split(":")[1];
        String dbUrl = "jdbc:postgresql://" + dbUri.getHost() + ':'
                + dbUri.getPort() + dbUri.getPath();

        Connection con = DriverManager.getConnection(dbUrl, username, password);
        return con;
    }

    public int insertData(String mac, int route, double latD, double longD) {
        int status = 201;

        drivercConnection();

        try {
            Connection con = null;
            try {
                con = getConnection();
            } catch (URISyntaxException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


            // Create a statement
            Statement stt = con.createStatement();

            DatabaseMetaData dbm = con.getMetaData();

            ResultSet tables = dbm.getTables(null, null, "bus", null);

            if (tables.next()) {
                // stt.execute("ALTER TABLE bus AUTO_INCREMENT = 1");

                return insertRecord(mac, route, latD, longD, status, con);

            } else {
                // Create bus table
                stt.execute("CREATE TABLE IF NOT EXISTS bus"
                        + "(id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,"
                        + "mac VARCHAR(30) NOT NULL UNIQUE,"
                        + "route int(11) NOT NULL,"
                        + "latitude FLOAT(10,6) NOT NULL,"
                        + "longitude FLOAT(10,6) NOT NULL,"
                        + "created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)");

                stt.execute("CREATE EVENT IF NOT EXISTS  AutoDelete "
                        + "ON SCHEDULE EVERY 3 MINUTE "
                        + "DO "
                        + "DELETE FROM bus WHERE created_at < (NOW() - INTERVAL 3 MINUTE)");

                stt.execute("SET GLOBAL event_scheduler = ON");

                first_data_insert(mac, route, latD, longD, con);

            }
            return status;
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return status = 520;

        }
    }
公共类数据库{
公共数据库(){
}
公共无效驱动器连接(){
试一试{
Class.forName(“com.mysql.jdbc.Driver”);
System.out.println(“jar-works:)”;
}catch(classnotfounde异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
私有静态连接getConnection()抛出URISyntaxException、SQLException{
uridburi=新的URI(System.getenv(“DATABASE_URL”);
字符串username=dbUri.getUserInfo().split(“:”[0];
字符串密码=dbUri.getUserInfo().split(“:”[1];
String dbUrl=“jdbc:postgresql://”+dbUri.getHost()+”:'
+dbUri.getPort()+dbUri.getPath();
Connection con=DriverManager.getConnection(dbUrl、用户名、密码);
返回con;
}
公共int insertData(字符串mac、int路由、双latD、双LONG){
int status=201;
驱动器连接();
试一试{
连接con=null;
试一试{
con=getConnection();
}捕获(URISyntaxException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
//创建一个语句
语句stt=con.createStatement();
DatabaseMetaData dbm=con.getMetaData();
ResultSet tables=dbm.getTables(null,null,“总线”,null);
if(tables.next()){
//stt.execute(“ALTER TABLE bus AUTO_INCREMENT=1”);
返回insertRecord(mac、路由、latD、LOGD、状态、con);
}否则{
//创建总线表
执行(“如果总线不存在,则创建表”
+(id INT(11)非空自动增量主键
+mac VARCHAR(30)非空唯一
+路由int(11)不为空
+纬度浮动(10,6)不为空
+经度浮点(10,6)不为空
+“在时间戳处创建(默认当前时间戳)”;
stt.execute(“如果不存在,则创建事件自动删除”
+“按计划每3分钟”
+“做”
+“从创建时的总线中删除(现在()-间隔3分钟)”;
执行(“设置全局事件_调度程序=ON”);
第一次数据插入(mac、路由、latD、LONG、con);
}
返回状态;
}捕获(SQLE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
返回状态=520;
}
}

表示sql查询不正确。您可能希望将其更改为类似的内容

DROP TABLE IF EXISTS bus;

CREATE TABLE bus( 
id SERIAL PRIMARY KEY,
mac VARCHAR(30) NOT NULL UNIQUE,
route int NOT NULL,
latitude numeric(10,6) NOT NULL,
longitude numeric(10,6) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);

请注意,create语句(afaik)不是sql标准命令。因此,因为您使用的是postgresql,所以需要将其更改为postgresql create语句。

在create查询末尾添加右括号可能会解决问题。
stt.execute(“create TABLE IF not EXISTS bus”+“(id INT(11)NOT NULL自动增量主键,“+”mac VARCHAR(30)NOT NULL UNIQUE,“+”路由int(11)NOT NULL,“+”纬度浮点(10,6)NOT NULL,“+”经度浮点(10,6)NOT NULL,“+”在时间戳默认当前时间戳时创建“)”)
但是现在需要括号了?!我试着给出了括号,但没有成功。谢谢!但是我会使用mysql,否则我会有很多代码需要更改。你知道有没有免费的提供商可以在servlet容器中用我的mysql语法部署我的Jersey项目?因为如果我在heroku提示符中键入以下命令`D:\maven\heroku\u maven\u by\u eclipse\serverSide>heroku插件:创建cleardb:ignite!请验证您的帐户以安装此插件计划(请输入信用卡)有关更多信息,请参阅ing Verify now,网址为“通常我使用openshift.com,因此您可能想尝试一下。请您看看这个问题:目前我正在获取
java.net.NoRouteToHostException:没有到主机的路由”