Можно использовать Apache calcite для подключения к Gemfire 9.x с помощью стороннего приложения БД - PullRequest
0 голосов
/ 15 октября 2018

Я использую стороннее приложение, размещенное на tomcat, которое разрешает только соединения jdbc для запросов к базе данных.В мастере настройки нового источника данных я вставил следующие данные

URL: jdbc:calcite:model=/someLocation/jdbcConnectionModel.json

Driver: org.apache.calcite.jdbc.Driver

/ someLocation / jdbcConnectionModel.json content:

inline:
{
  version: '1.0',
  schemas: [
     {
       type: 'custom',
       name: 'TEST',
       factory: 'org.apache.calcite.adapter.geode.rel.GeodeSchemaFactory',
       operand: {
         locatorHost: 'serverUrl', 
         locatorPort: '10150', 
         regions: 'testRegion', 
         pdxSerializablePackagePath: 'org.apache.calcite.adapter.geode.domain.*' 
       }
     }
   ]
}

Я скопировал следующие jar-файлы в папку lib tomcat, к которой приложение может получить доступ:

calcite-geode-1.17.0.jar
calcite-core-1.17.0.jar
commons-compiler-jdk-3.0.9.jar

Но выдает ошибку:

Ошибка тестирования соединения, проверьте конфигурацию DataSourceи попробуйте еще раз: не удается загрузить класс драйвера JDBC 'org.apache.calcite.jdbc.Driver'

Есть ли что-то, чего мне не хватает?

Я пытался из кода Java, и этоработает:

public class RelationalJdbcExample {

final static String geodeModelJson =
        "inline:"
            + "{\n"
            + "  version: '1.0',\n"
            + "  schemas: [\n"
            + "     {\n"
            + "       type: 'custom',\n"
            + "       name: 'TEST',\n"
            + "       factory: 'org.apache.calcite.adapter.geode.rel.GeodeSchemaFactory',\n"
            + "       operand: {\n"
            + "         locatorHost: 'serverUrl', \n"
            + "         locatorPort: '10150', \n"
            + "         regions: 'testRegion', \n"
            + "         pdxSerializablePackagePath: 'org.apache.calcite.adapter.geode.domain.*' \n"
            + "       }\n"
            + "     }\n"
            + "   ]\n"
            + "}";


public static Connection getGemfireConnection() throws ClassNotFoundException, SQLException{
    Class.forName("org.apache.calcite.jdbc.Driver");
    Properties info = new Properties();
    info.put("model", geodeModelJson);
    Connection connection = DriverManager.getConnection("jdbc:calcite:", info);
    return connection;
}


public static void main(String[] args) {

    Statement statement;
    try {
         Connection connection = getGemfireConnection();
         CalciteConnection calciteConnection =
                    connection.unwrap(CalciteConnection.class);
        statement = calciteConnection.createStatement();
        String query= "SELECT \"a\".\"testAttr\" FROM \"TEST\".\"testRegion\" AS \"a\" ";
        ResultSet resultSet = statement.executeQuery(query);


        System.out.println("resultSet===="+resultSet);
        while (resultSet.next()) {
            ResultSetMetaData metaData = resultSet.getMetaData();
            System.out.println(metaData.toString());
        }
    } catch (ClassNotFoundException | SQLException e) {
        e.printStackTrace();
    }
}

}

Приведенный выше код извлекает данные из кэша и возвращает их правильно.Пожалуйста, помогите.

...