Problemas de Performance Hibernate 3

4 respostas
robinsonbsilva

Senhores, tentei traduzir um tópico que relata fielmente meu problema(original: http://stackoverflow.com/questions/1306774/mapping-to-varchar-and-nvarchar-in-hibernate)

Tenho uma tabela com duas colunas no banco de dados:

codigo varchar (3)
nome nvarchar (50)

Como dizer ao hibernate passar varchar para um determinada pesquisa por código?

Na seqüência de mapeamentos hibernate é mapeado para nvarchar e produz consultas como:

SELECT codigo, nome FROM table WHERE codigo = N’AAA "(em vez de código = ‘AAA’)

Isso é péssimo, pois causa um FULL SCAN, em vez de usar o índice, e como código é gerado em muitas linhas, bem como em vários índices e chaves estrangeiras, transformando-o de varchar para nvarchar causar uma perda de performance (operações de IO como nvarchar usa o espaço duas vezes mais do que varchar).

Existe alguma maneira de resolver isso?

4 Respostas

E

Pede que pude entender está dizendo que se vc vc configurar o atributo type na sua coluna <property name="nome" type="AnsiString"/>
ou usar a anotação se for o caso @Type(type="AnsiString") irá resolver.
Não testei, então não garanto nada.

robinsonbsilva

Obrigado,

Vou testar aqui, depois dou um feedback.

robinsonbsilva

Boas,

Infelizmente o hibernate 3 não reconhece tal mapeamento:

&lt;property name="status" column="stMat" not-null="true" type="AnsiString"/&gt;

o erro abaixo é apresentado:

[10/09/12 16:03:28:699 BRT] 0000001a SystemErr     R org.hibernate.MappingException: Could not determine type for: AnsiString, at table: TABLE_R, for columns: [org.hibernate.mapping.Column(Status)]
	at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:292)
	at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:276)
	at org.hibernate.mapping.Property.isValid(Property.java:207)
	at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:458)
	at org.hibernate.mapping.RootClass.validate(RootClass.java:215)
	at org.hibernate.cfg.Configuration.validate(Configuration.java:1135)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1320)
	at br.gov.sp.prodesp.hibernate.util.HibernateUtil.loadSessionFactory(HibernateUtil.java:182)
	at br.gov.sp.prodesp.hibernate.util.HibernateUtil.&lt;init&gt;(HibernateUtil.java:133)
	at br.gov.sp.prodesp.peq.servlet.StartPlugin.inicializaHibernate(StartPlugin.java:92)
	at br.gov.sp.prodesp.peq.servlet.StartPlugin.init(StartPlugin.java:49)
	at org.apache.struts.action.ActionServlet.initModulePlugIns(ActionServlet.java:871)
	at org.apache.struts.action.ActionServlet.init(ActionServlet.java:359)
	at javax.servlet.GenericServlet.init(GenericServlet.java:256)
	at com.ibm.ws.webcontainer.servlet.ServletWrapper.init(ServletWrapper.java:235)
	at com.ibm.ws.wswebcontainer.servlet.ServletWrapper.init(ServletWrapper.java:342)
	at com.ibm.ws.webcontainer.servlet.ServletWrapper.initialize(ServletWrapper.java:1375)
	at com.ibm.ws.wswebcontainer.servlet.ServletWrapper.initialize(ServletWrapper.java:175)
	at com.ibm.wsspi.webcontainer.extension.WebExtensionProcessor.createServletWrapper(WebExtensionProcessor.java:99)
	at com.ibm.ws.webcontainer.webapp.WebApp.getServletWrapper(WebApp.java:934)
	at com.ibm.ws.webcontainer.webapp.WebApp.getServletWrapper(WebApp.java:856)
	at com.ibm.ws.webcontainer.webapp.WebApp.initializeTargetMappings(WebApp.java:574)
	at com.ibm.ws.webcontainer.webapp.WebApp.commonInitializationFinish(WebApp.java:395)
	at com.ibm.ws.wswebcontainer.webapp.WebApp.initialize(WebApp.java:293)
	at com.ibm.ws.wswebcontainer.webapp.WebGroup.addWebApplication(WebGroup.java:93)
	at com.ibm.ws.wswebcontainer.VirtualHost.addWebApplication(VirtualHost.java:162)
	at com.ibm.ws.wswebcontainer.WebContainer.addWebApp(WebContainer.java:673)
	at com.ibm.ws.wswebcontainer.WebContainer.addWebApplication(WebContainer.java:626)
	at com.ibm.ws.webcontainer.component.WebContainerImpl.install(WebContainerImpl.java:335)
	at com.ibm.ws.webcontainer.component.WebContainerImpl.start(WebContainerImpl.java:551)
	at com.ibm.ws.runtime.component.ApplicationMgrImpl.start(ApplicationMgrImpl.java:1274)
	at com.ibm.ws.runtime.component.DeployedApplicationImpl.fireDeployedObjectStart(DeployedApplicationImpl.java:1137)
	at com.ibm.ws.runtime.component.DeployedModuleImpl.start(DeployedModuleImpl.java:573)
	at com.ibm.ws.runtime.component.DeployedApplicationImpl.start(DeployedApplicationImpl.java:816)
	at com.ibm.ws.runtime.component.ApplicationMgrImpl.startApplication(ApplicationMgrImpl.java:945)
	at com.ibm.ws.runtime.component.ApplicationMgrImpl$AppInitializer.run(ApplicationMgrImpl.java:2120)
	at com.ibm.wsspi.runtime.component.WsComponentImpl$_AsynchInitializer.run(WsComponentImpl.java:342)
	at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1560)
rimolive

Isso depende dos tipos de dados que o dialeto do Hibernate registra. se não me engano. Veja um exemplo do Dialeto do MySQL 5:

protected void registerVarcharTypes() {
   registerColumnType( Types.VARCHAR, "longtext" );
// registerColumnType( Types.VARCHAR, 16777215, "mediumtext" );
   registerColumnType( Types.VARCHAR, 65535, "varchar($l)" );
   registerColumnType( Types.LONGVARCHAR, "longtext" );
}

O que precisa verificar é se no dialeto existe algum tipo registrado para Types.NVARCHAR, o que acredito que no MySQL não tenha.

Criado 10 de setembro de 2012
Ultima resposta 12 de set. de 2012
Respostas 4
Participantes 3