Java 通过自定义servlet通过Avatica公开基于方解石的数据库

Java 通过自定义servlet通过Avatica公开基于方解石的数据库,java,jdbc,jira,apache-calcite,Java,Jdbc,Jira,Apache Calcite,我已经用方解石帮助建立了我的自定义模式。现在我想通过servlet公开它,并用Avatica连接到它。我使用servlet是因为我的容器是JIRA。下面是来自servlet的一些相关代码 public class JDBCServlet extends HttpServlet { private final Service service; private final ProtobufHandler pbHandler; private final ProtobufTranslation pr

我已经用方解石帮助建立了我的自定义模式。现在我想通过servlet公开它,并用Avatica连接到它。我使用servlet是因为我的容器是JIRA。下面是来自servlet的一些相关代码

public class JDBCServlet extends HttpServlet {

private final Service service;
private final ProtobufHandler pbHandler;
private final ProtobufTranslation protobufTranslation;
private final MetricsSystem metrics;

final ThreadLocal<UnsynchronizedBuffer> threadLocalBuffer;

public JDBCServlet(LocalDBProvider provider) {
    this.service = provider.service();
    this.metrics = provider.metrics();
    this.protobufTranslation = new ProtobufTranslationImpl();
    this.pbHandler = new ProtobufHandler(service, protobufTranslation, metrics);
    this.threadLocalBuffer = new ThreadLocal<UnsynchronizedBuffer>() {
        @Override
        public UnsynchronizedBuffer initialValue() {
            return new UnsynchronizedBuffer();
        }
    };
}

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("DO GET DO GET");
    doPost(req, resp);
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("DO POST DO POST");
    response.setContentType("application/octet-stream;charset=utf-8");
    response.setStatus(HttpServletResponse.SC_OK);
    final byte[] requestBytes;
    // Avoid a new buffer creation for every HTTP request
    final UnsynchronizedBuffer buffer = threadLocalBuffer.get();
    try (ServletInputStream inputStream = request.getInputStream()) {
        requestBytes = AvaticaUtils.readFullyToBytes(inputStream, buffer);
    } finally {
        buffer.reset();
    }

    Handler.HandlerResponse<byte[]> handlerResponse;
    try {
        handlerResponse = pbHandler.apply(requestBytes);
    } catch (Exception e) {
        handlerResponse = pbHandler.convertToErrorResponse(e);
    }
    response.setStatus(handlerResponse.getStatusCode());
    response.getOutputStream().write(handlerResponse.getResponse());
    response.getOutputStream().close();
}
}
使用url连接squirrel(使用avatica jars:)时: jdbc:avatica:remote:url=

几个HTTP POST请求与驱动程序握手,但整个过程在Meta.toProto()方法上失败:


我假设我启动servlet时出错了,但不知道为什么?

在处理了方解石之后,我使用Evatica服务器示例中的JDBCMeta成功地处理了这个问题


从我以前的解决方案来看,我认为基于CalciteConnection的驱动程序生成的Meta与avatica LocalService实现不兼容。

您能告诉我更多关于如何使用avatica的JDBCMeta的详细信息吗?你确定这不可能吗(
new LocalService(DRIVER.createMeta((AvaticaConnection) bootstrap.getConnection()));
    } else {
      // Can a "row" be a primitive? A struct? Only an Array?
      throw new RuntimeException("Only arrays are supported");
    }