Lösung: in der Registry unter diesen Keys die entsprenden Dateiendung löschen:
HKEY_CLASSES_ROOT
und
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts
Tips,Tricks,Links rund um Java, .NET, Datenbanken
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts
oracle.adf.view.faces.CLIENT_STATE_MAX_TOKENS
Vor JDK 1.6 kann ein HeapDump nur im Fehlerfall
über folgende VM-Argumente
geschrieben werden:
-XX:HeapDumpPath=path -XX:HeapDumpOnOutOfMemoryError
Nachtrag (Danke an Markus Kohler, siehe Kommentar): Mit JDK 1.4 und JDK 1.5 gibt es in den neueren Versionen auch die Option
-XX:+HeapDumpOnCtrlBreak
Das ermöglicht beim Drücken von "Ctrl" + "Break" einen HeapDump in das Ausführungsverzeichnis zu schreiben.
Die HeapDumpPath hat hier keine Auswirkung.
Ab JDK 1.6 kann über folgendes VM-Argument ein HeapDump geschrieben werden.
Das Schreiben findet aber erst nach Beendung des Programms statt.
-Xrunhprof:format=b,file=mysnapsot.hprof
Alternativ kann man auch zur Laufzeit eines Java-Programms einen
Heap-Dump erzeugen über das Tool jmap im Bin-Verzeichnis des SDK:
jmap -dump:format=b,file=snapshot2.hprof <pid>
Eine weitere Möglichkeit bietet JMX. In der MBean
com.sun.management:type=HotSpotDiagnostic
gibt es die Methode
dumpHeap(String , boolean )
Über diese kann ebenfalls im laufenden Betrieb ein Dump erstellt werden.
Analysiert werden kann der Dump dann z.B. über
jhat.exe
mysnapsot.hprof
(im JDK-Bin-Verzeichnis) Startet per Default einen WebServer auf Port 7000.
Den Dump kann man sich im Browser unter der Adresse http://localhost:7000 anschauen
den kostenlosen SAP Memory Analyzer - eine komfortabele Oberfläche auf Basis Eclipse RCP
Für optimale Performance sollte die Major GC selten laufen.
CA FE BA BE 00 00 00 30ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
...
}
Beispiel:
Java-Version | Byte-Code-Version |
---|---|
1.0 | 45.0 (00 00 00 2D) |
1.1 | 45.3 (00 03 00 2D) |
1.2 | 46 (00 00 00 2E) |
1.3 | 47 (00 00 00 2F) |
1.4 | 48 (00 00 00 30) |
5.0 (1.5) | 49 (00 00 00 31) |
6.0 (1.6) | 50 (00 00 00 32) |
linkd "C:\Program Files" c:\programmebzw.
junction "C:\Program Files" c:\programmeJunction ist von Sysinternals
subst e: "C:\Bilder"
signtool sign /a MyFile.exe
kann auch als PostBuild-Ereignis definiert werden.
class Person
{
private string id;
private string name;
private Address homeAddr;
public string ID
{
get { return id;}
set { id = value;}
}
public Address HomeAddr
{
get { return homeAddr;}
set { homeAddr = value;}
}
...
}
class Address
{
private string cityname;
private string postcode;
public string CityName
{
get { return cityname;}
set { cityname = value;}
}
...
}
Man möchte als Inhalt einer Spalte HomeAddr.Cityname der Klasse Person anzeigen:
Folgender Code bringt nur den Klassenname:
Dieser Code bringt keinen Inhalt
myDataGridViewTextBoxColumn1.DataPropertyName = "HomeAddr.Cityname";
<project name="MyProj" default="all" basedir=".">
<property file="build.properties"/>
<path id="toolslib">
<path location="${dbjar}"/>
<path location="."/>
<fileset dir="${hibernate.path}">
<include name="**/*.jar"/>
</fileset>
<fileset dir="${hibernate.tools.path}">
<include name="**/*.jar"/>
</fileset>
</path>
<taskdef name="hibernatetool"
classname="org.hibernate.tool.ant.HibernateToolTask"
classpathref="toolslib"/>
<target name="reveng" description="Reverse Engineer from DB">
<hibernatetool destdir="./hib-gen">
<jdbcconfiguration configurationfile="hibernate.cfg.xml"
packagename="de.rfeest.dataaccess.orm"
revengfile="hibernate.reveng.xml"/>
<hbm2hbmxml destdir="./hib-gen"/>
</hibernatetool>
</target>
<target name="javagen" description="Create Java classes from xml">
<hibernatetool destdir="./src">
<configuration configurationfile="./src/hibernate.cfg.xml"/>
<hbm2java destdir="./src"/>
<hbm2dao destdir="src"/>
</hibernatetool>
</target>
<target name="ddlgen" description="Create DDL from xml">
<hibernatetool destdir="./src">
<configuration configurationfile="./src/hibernate.cfg.xml"/>
<hbm2ddl export="false" outputfilename="./create-tables.ddl"/>
<hbm2doc/>
</hibernatetool>
</target>
<target name="hibernate-docgen" description="Create DDL from xml">
<hibernatetool destdir="../orm">
<configuration configurationfile="src/hibernate.cfg.xml"/>
<hbm2doc/>
</hibernatetool>
</target>
</project>
<Resource name="jdbc/MYDATASOURCE"
scope="Shareable"
type="javax.sql.DataSource"
auth="Container"
url="jdbc:db2:dbinst"
maxIdle="10"
maxOpenPreparedStatements="50"
maxActive="50"
validationQuery="Select xxx from yyy FETCH FIRST 1 ROWS ONLY FOR FETCH ONLY"
testWhileIdle="true"
timeBetweenEvictionRunsMillis="600000"
driverClassName="COM.ibm.db2.jdbc.app.DB2Driver"
maxWait="10000"
username="myuser"
factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
poolPreparedStatements="true"
password="hispass"
removeAbandoned="true"
removeAbandonedTimeout="180"
logAbandoned="true"
/>
<web-app>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/classes/log4j.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
...
</web-app>
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section
name="hibernate-configuration"
type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate"
/>
</configSections>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="connection.provider">
NHibernate.Connection.DriverConnectionProvider
</property>
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
<property name="default_schema">dbo</property>
<property name="connection.connection_string">Server=myserver;Initial Catalog=mydb;Integrated Security=True</property>
<property name="show_sql">true</property>
<mapping assembly="MyAssembly" />
</session-factory>
</hibernate-configuration>
</configuration>
public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse,
FilterChain filterChain) {
HttpServletRequest req = (HttpServletRequest)servletRequest;
try {
req.setCharacterEncoding("UTF-8");
}
catch (UnsupportedEncodingException e) {
logger.error(e);
}
...
<%@ page contentType="text/html;charset=windows-1252" isELIgnored="true" %>b)
Stichworte:
JNDI, global, Datasource, DB, JDBC
Problem:
Eine Globale Resource in einer Webanwendung verwende.
Lösung:
Zunächst muss die Resource global definiert werden
<GlobalNamingResources>
<!-- JNDI-Datasource fuer die Testdatenbank -->
<Resource name="jdbc/DB2TGLOBAL"
auth="Container"
type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/DB2TGLOBAL">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
...
</ResourceParams>
</GlobalNamingResources>
Im Context der Anwendung muss eine Referenz auf die globale Datasource angegeben werden:
<ResourceLink name="jdbc/DB2TPooledDS" global="jdbc/DB2TGLOBAL" type="javax.sql.DataSource" />
ArrayList al = (DataGridColumnStyle[])al.ToArray(typeof(DataGridColumnStyle)));
String searchBase = "DC=xxx,DC=xyz,DC=co,DC=za";
String searchString = "SamAccountName=";
String dn = "";
SearchControls constraints = new SearchControls();
constraints.setSearchScope (SearchControls.SUBTREE_SCOPE);
// Perform seach
NamingEnumeration results =
ctx.search(searchBase, searchString + username.trim(), constraints);
// Loop though results
if (results.hasMore())
{
SearchResult sr = (SearchResult) results.next();
dn = sr.getName();
dn=dn + "," + searchBase
}
ctx.close();
ctx=null;
return dn;
<!-- Limit the org.hibernate category to INFO since logging to DEBUG affects performance badly -->
<category name="org.hibernate">
<priority value="INFO"/>
</category>
<!-- Log SQL statements-->
<category name="org.hibernate.SQL">
<priority value="DEBUG"/>
</category>
<!-- Log the values assigned to the SQL parameters and results -->
<category name="org.hibernate.type">
<priority value="DEBUG"/>
</category>
<!-- Log transaction event/JTA -->
<category name="org.hibernate.transaction">
<priority value="DEBUG"/>
</category>
<category name="org.hibernate.event.def.AbstractFlushingEventListener">
<priority value="
Prüfen, ob im Mapping ein unsaved-value definiert ist:
<id name="id" column="id" unsaved-value="0">
Stichworte:
JDev, JDeveloper, org.hibernate.QueryException, ClassNotFoundException : org.hibernate.hql.ast.HqlToken
Problem:
Im JDeveloper bekommt man mit Hibernate folgende Exception zur Laufzeit geworfen:
org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.
Ursache:
In der JDeveloper-Verzeichnisstruktur befindet sich im Toplink-Verzeichnis eine Version von antlr.jar -> Diese verträgt sich nicht mit dem antlr.jar, das Hibernate benötigt.
Lösung:
Das antlr.jar von Jdeveloper muss einfach gelöscht/ersetzt werden.
Stichworte:
JDeveloper 10.1.3 DB Connection Schema
Problem:
Per Default ist immer nur das Schema des Benutzers unter den eingerichteten Conenctions sichtbar
Lösung:
Zum Hinzufügen eines weiteren Schemas, muss unter Database die gewünschte DB gewählt werden und dann oben auf den "Trichter" geklickt werden.
Dort kann man dann sämtliche Schemas hinzufügen.
Problem: no class definition found
Lösung: in orion-web.xml:
<web-app-class-loader search-local-classes-first="true"
include-war-manifest-class-path="true" />
3) Connection im Java-Code öffenen über JNDI
try {
InitialContext initCtx = new InitialContext();
Context ctx = (Context) initCtx.lookup(“java:comp/env”);
//Context ctx = new InitialContext();
if (ctx == null) {
logger.error("No InitialContext available");
} else {
dataSource = (DataSource) ctx.lookup(“jdbc/DB2PooledDS”);
}
} catch (NamingException ne) {
logger.error(ne);
}
try {
Connection conn = getDataSource().getConnection();
} catch (SQLException e) {
logger.error(e);
}
Stichworte:
JDEV, JDeveloper, JSF, ADF, Migration, Problem, 10.1.3.1, OC4J
Problem:
Nach der Migration eines JSF/ADF Projekts nach JDeveloper 10.1.3.1gibt es folgende Fehlermeldung zur Laufzeit
500 Internal Server Error
java.lang.NoSuchMethodError: oracle.adf.view.faces.context.AdfFacesContextFactory.createContext(Ljava/lang/Object;Ljava/lang/Object;)Loracle/adf/view/faces/context/AdfFacesContext; at oracle.adfinternal.view.faces.webapp.AdfFacesFilterImpl.doFilter(AdfFacesFilterImpl.java:187) at …
Ursache:
Das Projekt verwendet in seinem WEB-INF\lib-Pfad veraltete Libraries (JSF und ADF), die mit dem neuen OC4J nicht funktionieren.
Lösung:
Es müssen die Libraries aus dem JDEV 10.1.3.1 in Lib-Pfad kopiert werden.
NumberFormat nf = NumberFormat.getNumberInstance();
double d = nf.parse("12,3332").doubleValue());
DateFormat dateFormatter = DateFormat.getDateInstance(DateFormat.DEFAULT,new Locale("de", "DE"));
String s = dateFormatter.format(datum);
Stichworte:
log4j, category, debug, error, info, only, nur eine, LevelRangeFilter
Problem:
Man möchte in einem File nur Logging-Messages einer Kategorie (und nicht der darüber liegenden auch noch), z.B. INFO speichern.
Lösung:
Es muss ein LevelRangeFilter verwendet werden:
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
<appender name="INFO" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="logs/PSASAS_info.log"/>
<param name="DatePattern" value="'.'yyyy-MM-dd"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-4r [%t] %-5p (%c:%L)/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="INFO" />
<param name="LevelMax" value="INFO" />
</filter>
</appender>
<root>
<priority value="debug"/>
<appender-ref ref="INFO"/>
</root>
</log4j:configuration>
protected override void WndProc(ref Message m)
{
// Werte aus winuser.h
System.IntPtr SC_MINIMIZE = new IntPtr(0xF020);
System.IntPtr SC_MAXIMIZE = new IntPtr(0xF030);
System.IntPtr SC_RESTORE= new IntPtr(0xF120);
if (m.WParam == SC_MINIMIZE)
{
if (this.WindowState!=FormWindowState.Maximized)
sizeBeforeMin=this.Size;
}
if (m.WParam == SC_MAXIMIZE)
{
sizeBeforeMin=this.Size;
}
if (m.WParam ==SC_RESTORE )
{
System.Diagnostics.Debug.WriteLine("WNDPROC wieder");
}
base.WndProc (ref m);
}
Oracle9i Implementation:
In Oracle9i, the MERGE statement INSERTS and UPDATES the data with a single SQL statement.
MERGE INTO SALES_FACT D
USING SALES_JUL01 S
ON (D.TIME_ID = S.TIME_ID
AND D.STORE_ID = S.STORE_ID
AND D.REGION_ID = S.REGION_ID)
WHEN MATCHED THEN
UPDATE
SET d_parts = d_parts + s_parts,
d_sales_amt = d_sales_amt + s_sales_amt,
d_tax_amt = d_tax_amt + s_tax_amt,
d_discount = d_discount + s_discount
WHEN NOT MATCHED THEN
INSERT (D.TIME_ID ,D.STORE_ID ,D.REGION_ID,
D.PARTS ,D.SALES_AMT ,D.TAX_AMT ,D.DISCOUNT)
VALUES (
S.TIME_ID ,S.STORE_ID ,S.REGION_ID,
S.PARTS ,S.SALES_AMT ,S.TAX_AMT ,S.DISCOUNT);
Oracle8i Implementation:
In Oracle8i, you could choose to implement it as a sequence of DML statements.
UPDATE
(SELECT
S.TIME_ID ,S.STORE_ID ,S.REGION_ID,
S.PARTS s_parts ,S.SALES_AMT s_sales_amt ,S.TAX_AMT s_tax_amt ,S.DISCOUNT s_discount,
D.PARTS d_parts ,D.SALES_AMT d_sales_amt ,D.TAX_AMT d_tax_amt ,D.DISCOUNT d_discount
FROM SALES_JUL01 S, SALES_FACT D
WHERE D.TIME_ID = S.TIME_ID
AND D.STORE_ID = S.STORE_ID
AND D.REGION_ID = S.REGION_ID) JV
SET d_parts = d_parts + s_parts,
d_sales_amt = d_sales_amt + s_sales_amt,
d_tax_amt = d_tax_amt + s_tax_amt,
d_discount = d_discount + s_discount
;
INSERT INTO SALES_FACT (
TIME_ID,STORE_ID ,REGION_ID,
PARTS ,SALES_AMT ,TAX_AMT ,DISCOUNT)
SELECT
S.TIME_ID ,S.STORE_ID ,S.REGION_ID,
S.PARTS ,S.SALES_AMT ,S.TAX_AMT ,S.DISCOUNT
FROM SALES_JUL01 S
WHERE (S.TIME_ID, S.STORE_ID, S.REGION_ID) NOT IN (
SELECT D.TIME_ID, D.STORE_ID, D.REGION_ID
FROM SALES_FACT D
)
;
create or replace and compile java source named helloworldinthedatabase as
public class HelloWorldInTheDatabase{
public static int test(int num) {
int temp;
temp = num + 42;
return temp;
}
}
**************************************************************************************************
2. Proz. oder Funktion erstellen: (Veröffentlichen der Klassen in der DB, Namen der
Java-Prozeduren und Parametertypen auf ihre Gegenstücke in PL/SQL abbilden)
create or replace function start_helloworld (num in number) return number
authid current_user
as language java name 'HelloWorldInTheDatabase.test(int) return int';
**************************************************************************************************
3. Prozedur start_helloword ausführen
JDBC kann dadurch nicht zugreifen
Ursache:
Sie verwenden eine Version von Microsoft SQL Server 2000 oder Microsoft SQL Server 2000 Desktop Engine (auch MSDE), die bei Verwendung mit dieser Windows-Version bekannte Sicherheitsrisiken enthält. Der TCP/IP-Netzwerkport und der UDP- Netzwerkport von Microsoft SQL Server 2000, MSDE oder von beiden wurde deaktiviert, um das Sicherheitsrisiko möglicher Virusattacken auf dem Computer zu reduzieren.
Lösung:
Installieren Sie einen Patch oder das letzte Servicepack für Microsoft SQL Server 2000 oder MSDE von http://www.microsoft.com/sql/downloads/default.asp
Stichworte:
JMX, MX4J, J2K, JDK1.4
Problem:
Zur Serverüberwachung des Tomcat soll JMX unter JDK 1.4 verwendet werden.
Ursache:
JDK 1.4 unterstützt von Haus aus JMX noch nicht.
Lösung:
Es gibt ein JMX-Toolkit: MX4J unter http://mx4j.sourceforge.net/ (dort allerdings nur in Version 3, die keine RMI-Adaptor zur Verfügung stellt).
Mit MC4J gibt es einen grafischen Client (http://mc4j.org). In diesem sind noch die alten MX4J-Libs mit dem richtigen Adaptor vorhanden.
Die mx4j-tools-1.1.1.jar muss server\lib kopiert werden.In der Datei conf\jk2.properties muss folgendes eingetragen werden:
mx.enabled=true
#RMI enablen
mx.jrmpPort=1099
mx.jrmpHost=localhost
#Optional auch den HttpAdaptor anschalten
mx.httpPort=9999
mx.httpHost=localhost
Einen Connect über einen Java-Client geht so:
import java.util.Hashtable;
import javax.naming.Context;
import mx4j.connector.rmi.jrmp.JRMPConnector;
public class JMXTest {
public JMXTest() {
}
static public void main(String[] sarr) {
try {
String jndiName = "jrmp";
JRMPConnector connector = new JRMPConnector();
Hashtable environment = new Hashtable();
environment.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
environment.put(Context.PROVIDER_URL, "rmi://localhost:9000");
connector.connect(jndiName, environment);
mx4j.connector.RemoteMBeanServer server = connector.getRemoteMBeanServer();
Integer count = server.getMBeanCount();
System.out.println("MBeans: "+count.intValue());
}
catch (Exception e) {
e.printStackTrace();
}
}
}
Eigen MBean erstellen. Es sollte die mx4j-jmx.jar (befindet sich in der Standard-Distribution in server\lib) in common\lib kopiert werden, damit alle WebApps Zugriff auf die selbe JMX-Implementierung haben.
Zunächst ein Interface erstellen, dieses muss im Tomcat immer die Namensgebung
haben.
public interface SystemInfoMBean
{
public long getMaxMemory();
}
Die Implementierung der MBean sieht wie folgt aus:
public class SystemInfo implements SystemInfoMBean {
public SystemInfo() {
MBeanServer server = getServer();
ObjectName name = null;
try {
name = new ObjectName("Application:Name=SystemInfoBean,Type=System");
server.registerMBean(this, name);
} catch (Exception e) {
e.printStackTrace();
}
}
private MBeanServer getServer() {
MBeanServer mbserver = null;
ArrayList mbservers = MBeanServerFactory.findMBeanServer(null);
if (mbservers.size() > 0) {
mbserver = (MBeanServer) mbservers.get(0);
}
if (mbserver != null) {
System.out.println("Found our MBean server");
} else {
mbserver = MBeanServerFactory.createMBeanServer();
}
return mbserver;
}
public long getMaxMemory() {
return Runtime.getRuntime().maxMemory()/1024;
}
}