Java 将*作为参数传递时占用大量时间的可调用语句

Java 将*作为参数传递时占用大量时间的可调用语句,java,hibernate,stored-procedures,jdbc,callable-statement,Java,Hibernate,Stored Procedures,Jdbc,Callable Statement,我有下面的代码。当我传递普通字符串时,比如“firstname lastname”。存储过程将立即返回。但是当我用firstname*来称呼它时,它需要很多时间。当我用firstname*执行存储过程时,不会超过2秒。下面是代码 public List<NameBean> getNameReportJson(final int numberOfResults, final String searchValue, final String category, Conne

我有下面的代码。当我传递普通字符串时,比如“firstname lastname”。存储过程将立即返回。但是当我用firstname*来称呼它时,它需要很多时间。当我用firstname*执行存储过程时,不会超过2秒。下面是代码

public List<NameBean> getNameReportJson(final int numberOfResults,
        final String searchValue, final String category, Connection con)
        throws SQLException {

    final List<NameBean> beanList = new ArrayList();
    List<String> resultStrs = new ArrayList<String>();
    final String nameReportStoreProcedure = "{call [sp_SENTRY_INFORMATION_REPORT_NAME_REPORT] (?,?,?,?,?)}";

    Session session = (Session) em.getDelegate();
    StringBuffer sb = new StringBuffer();

    session.doWork(new Work() {

        @Override
        public void execute(Connection connection) throws SQLException {
            CallableStatement cstmt = connection
                    .prepareCall(nameReportStoreProcedure);
            ResultSet rs = null;

            cstmt.setInt("numberOfResults", numberOfResults);
            cstmt.setString("SearchValue", searchValue);
            cstmt.setString("Category", category);
            cstmt.setDate("startDate", null);
            cstmt.setDate("endDate", null);

            rs = cstmt.executeQuery();
            logger.debug("CeReport the ResultSet is: " + rs);
            while (rs.next()) {
                NameBean nameBean = new NameBean();
                String oriName = rs.getString("ORIGINAL NAME");
                String standName = rs.getString("STANDARDIZED NAME");
                String groupName = rs.getString("GROUP NAME");
                long groupId = rs.getLong("GROUP ID");
                nameBean.setOriginalName(oriName);
                nameBean.setStandardName(standName);
                nameBean.setGroupName(groupName);
                nameBean.setGroupID(groupId);
                nameBean.setEntityID(rs.getString("ENTITY ID"));
                beanList.add(nameBean);
            }

        }

    });

    return beanList;
}
public List getnamereptjson(final int numberOfResults,
最终字符串搜索值、最终字符串类别、连接con)
抛出SQLException{
最终列表beanList=新的ArrayList();
List resultStrs=new ArrayList();
最终字符串nameReportStoreProcedure=“{调用[sp_SENTRY_INFORMATION_REPORT_NAME_REPORT](?,?,?,?,?)}”;
会话=(会话)em.getDelegate();
StringBuffer sb=新的StringBuffer();
会议.工作(新工作){
@凌驾
public void execute(连接)引发SQLException{
CallableStatement cstmt=连接
.prepareCall(名称报告存储过程);
结果集rs=null;
cstmt.setInt(“numberOfResults”,numberOfResults);
cstmt.setString(“SearchValue”,SearchValue);
cstmt.setString(“类别”,类别);
cstmt.setDate(“startDate”,null);
cstmt.setDate(“endDate”,空);
rs=cstmt.executeQuery();
debug(“CeReport结果集为:”+rs);
while(rs.next()){
NameBean NameBean=新的NameBean();
String oriName=rs.getString(“原始名称”);
String standName=rs.getString(“标准化名称”);
String groupName=rs.getString(“组名”);
long groupId=rs.getLong(“组ID”);
nameBean.setOriginalName(oriName);
nameBean.setStandardName(标准名称);
setGroupName(groupName);
setGroupID(groupId);
setEntityID(rs.getString(“实体ID”);
添加(nameBean);
}
}
});
返回beanList;
}

找到了原因。当同时有对存储过程的请求时,问题就发生了。罪魁祸首是这份声明

Session session = (Session) em.getDelegate();

因此,我必须为每个请求创建一个新的EntityManager实例,然后使用该实例获取会话。由于会话由多个线程共享,因此它锁定了表,因此出现了问题。我希望这对其他人有所帮助

可能是因为应用程序中配置的事务类型,我们缺少一些信息……我在任何地方都看不到任何事务。我查看了存储过程及其一系列带有连接的选择。这也是在一个web应用程序中,它有一个REST端点,它是关于它的,在db上没有其他运行的吗?数据库是什么?您是否尝试过更改jdbc驱动程序?事实上,您能检查一下与数据库建立连接是否没有延迟吗?