使用JPA背后的Hibernate 3.3.2GA(以及JBoss 5中包含的其余Hibernate包)存在奇怪的性能问题.
我正在使用Native Query,并将SQL组装成预准备语句.
EntityManager em = getEntityManager(MY_DS);
final Query query = em.createNativeQuery(fullSql, entity.getClass());
Run Code Online (Sandbox Code Playgroud)
SQL有很多连接,但实际上非常基本,只有一个参数.喜欢:
SELECT field1, field2, field3 FROM entity left join entity2 on... left join entity3 on
WHERE stringId like ?
Run Code Online (Sandbox Code Playgroud)
并且查询在MSSQL Studio上运行一秒钟.
如果我加
query.setParameter(0, "ABC123%");
Run Code Online (Sandbox Code Playgroud)
查询将暂停9秒
2012-01-20 14:36:21 - TRACE: - AbstractBatcher.getPreparedStatement:(484) | preparing statement
2012-01-20 14:36:21 - TRACE: - StringType.nullSafeSet:(133) | binding 'ABC123%' to parameter: 1
2012-01-20 14:36:30 - DEBUG: - AbstractBatcher.logOpenResults:(382) | about to open ResultSet (open ResultSets: 0, globally: 0)
Run Code Online (Sandbox Code Playgroud)
但是,如果我只是替换"?" 使用该值(使其不是Prepared Statement,而只是一个直接的SQL查询. …
从我的所有应用程序使用net.sourceforge.jtds.jdbc.Driver作为我的MSSQL驱动程序.我在准备好的语句中遇到了性能问题,并了解到sendStringParametersAsUnicode = false应该可以解决问题.不幸的是,我似乎无法让司机接受这个价值.我可以得到Microsoft驱动程序com.microsoft.sqlserver.jdbc.SQLServerDriver接受参数就好了:
jdbc:sqlserver://servername:1433;databaseName=dbname;sendStringParametersAsUnicode=false
Run Code Online (Sandbox Code Playgroud)
在persistence.xml和我的ds.xml中工作.准备好的陈述很快就会在22秒内完成.
但是,我似乎无法从JTDS获得相同的性能提升.它仍然围绕着准备好的语句,每次迭代需要几秒钟.
我在字符串上尝试了几种变体,并且在我的测试中看到了相同的延迟(使用Hibernate.connection.url的persistence.xml)和使用JTA和ds.xml的服务器.
jdbc:jtds:sqlserver://server:1433/dbname;sendStringParametersAsUnicode=false
jdbc:jtds:sqlserver://server:1433;sendStringParametersAsUnicode=false;databaseName=dbname
jdbc:jtds:sqlserver://server:1433;sendStringParametersAsUnicode=false;selectMethod=cursor;socketKeepAlive=true;databaseName=dbname
Run Code Online (Sandbox Code Playgroud)
我读过的所有内容都表明Microsoft驱动程序速度较慢,而且我的公司过去也遇到过问题.如果可能的话,我真的很想使用JTDS,但是不能等待准备好的声明10秒!
有人有什么想法吗?
谢谢
环境 = JBoss 7.2.0.Final + RESTEasy 2.3.5.Final + Swagger 1.3.10
尝试设置一个没有 web.xml 的 WAR 并使用 Swagger。如果 ApplicationPath 中有任何值,它就会起作用
@javax.ws.rs.ApplicationPath("test")
@WebServlet(name = "RestEasy-1", loadOnStartup = 1)
@Path("/message")
@Api(value="/message",description="hello api")
Run Code Online (Sandbox Code Playgroud)
适用于 URL
http://localhost:8080/RestEasy-1/test/message/xyz (THE SERVICE)
http://localhost:8080/RestEasy-1/test/api-docs (SHOWS SWAGGER JSON)
http://localhost:8080/RestEasy-1/ (RUNS SWAGGER UI)
Run Code Online (Sandbox Code Playgroud)
但是如果我更改为:
@javax.ws.rs.ApplicationPath("") (also tried /* or * or /)
Run Code Online (Sandbox Code Playgroud)
该服务和 api-docs 有效,但 Swagger 似乎不可用。
我猜想这是与 servlet 根上的侦听器发生冲突,但我有一个预先存在的约束,即服务在根 + 路径上运行,因此我需要一个空白的 ApplicationPath。
知道 Swagger 是否可以设置为手动运行不同的路径吗?
我已经尝试过使用Swagger JaxRs当前主版本1.0和Swagger 2.0的devel_2.0分支。
@ApiModel(value = "Animal",
subTypes = {Dog.class, Lion.class},
discriminator = "type")
public class Animal {
@ApiModelProperty(value = "the discriminator field.")
private String type;
Run Code Online (Sandbox Code Playgroud)
这是子类之一,
@ApiModel(value = "Lion", parent = Animal.class)
public class Lion {
@ApiModelProperty(value = "the discriminator field.")
private String type;
Run Code Online (Sandbox Code Playgroud)
我没有找到任何期望的例子,但这是我当前的Swagger 2.0项目swagger.json文件中的输出。
"definitions":{
"Animal":{
"properties":{
"type":{
"type":"string",
"description":"the discriminator field."
}
},
"discriminator":"type"
},
Run Code Online (Sandbox Code Playgroud)
定义中没有Dog或Lion对象的迹象。请求对象中没有任何内容。我不确定这是否会奏效,但是如果您知道它应该如何运作,请告诉我。
如果要查看完整的上下文,所有代码都在这里。
https://github.com/javatestcase/RestEasy/tree/RestEasyVersion2