Oracle lockok kezelése

A lock-ok listája:

SELECT l.inst_id,SUBSTR(L.ORACLE_USERNAME,1,8) ORA_USER, SUBSTR(L.SESSION_ID,1,3) SID,
S.serial#,
SUBSTR(O.OWNER||'.'||O.OBJECT_NAME,1,40) OBJECT, P.SPID OS_PID,
DECODE(L.LOCKED_MODE, 0,'NONE',
1,'NULL',
2,'ROW SHARE',
3,'ROW EXCLUSIVE',
4,'SHARE',
5,'SHARE ROW EXCLUSIVE',
6,'EXCLUSIVE',
NULL) LOCK_MODE
FROM sys.GV_$LOCKED_OBJECT L, DBA_OBJECTS O, sys.GV_$SESSION S, sys.GV_$PROCESS P
WHERE L.OBJECT_ID = O.OBJECT_ID
and l.inst_id = s.inst_id
AND L.SESSION_ID = S.SID
and s.inst_id = p.inst_id
AND S.PADDR = P.ADDR(+)
order by l.inst_id;

Lock-ok eltávolítása:

ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;

Ahol értelemszerűen a sid,serial# az előző selectből jönnek.

Visio 2007

Van amikor az ember dolgozni szeretne, és azon kapja magát, hogy a szoftver amit használ ebben nem igazán támogatja.
Így jártam én a Microsoft Visio 2007-el, amikor adatbázist szerettem volna tervezni.
Természetesen a help, hibátlan magyarsággal, rövid és velős választ ad:


A Microsoft Office Visio programban Adatbázismodell-diagram sablonját használó személyek gyakori kérdése, hogy Mi történt a Létrehozás és a Frissítés parancsokkal?"
Röviden összefoglalva annyi, hogy a Létrehozás és a Frissítés parancs nem érhető el a Microsoft Office Visio 2003 Standard és Professional kiadásaiban vagy a Microsoft Office Visio 2007 alkalmazásban.
Az adatbázis-modellező szolgáltatások teljes körét, beleértve a Létrehozás és Frissítés parancsot is, a Microsoft Office Visio vállalati építészek számára készült verziójában találhatja meg. A Visio vállalati építészek számára az MSDN Premium Subscription része, mely a Microsoft Visual Studio Professional és a Visual Studio Team System szerepalapú kiadásaival érhető el.

Ezen a ponton látszik, hogy a help fordítói komolyan vették a munkát. Sebaj.
Tehát aki adatbázis modellből adatbázist akar generálni, annak szüksége van vállalatépítészeti visiora.
Mivel én komoly vállalatépítésznek gondolom magam, beszereztem egy Visio for Enterprise Architecht-et biztos ami biztos.
Nagy rutinnal a telepítő azt mondta, hogy Visual Studio nélkül ez nem telepíthető.
Szerintem meg igen, aki nem hiszi írja bele a registrybe az alábbi sort, és már működik is.

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\Setup\VS\VSTD]
"ProductDir"="."

Egyébként a 2007-es Visio teljesen ugyanaz az engine mint a 2005-ös EA edition. Picit módosítottak a guin, eladták ugyanazt, mégegyszer, és még db-t sem lehet vele generálni…
Ha valaki mindkettőt felrakja (akárcsak én), akkor amint a másik verziót indítjuk kedvességből kapunk 10 perc setup-ot…
MS

SVCgen batch processing, and parameters

Az SVC technológia kapcsán (ami egyébként kivételesen ötletes) az az érzése lehet az embernek, mintha nem lett volna rá idő rendesen beintegrálni a Visual Studio 2008-ba, ugyanis nincs módunk a kliens stub-ok generálására studióból. Vagy legalábbis én még nem jöttem rá erre. De sebaj, van megoldás. Írni kell két bat filét.

svc.bat

@echo off
echo Starting servicestub generation 
cmd /V:ON /C svcgen.bat

svcgen.bat

@echo off
set serviceList=system/system.svc,other/other1.svc,common/common.svc,admin/admin.svc

set serviceHost=http://localhost:3467/services/
set outputDir=.\client\serviceproxy\servicestubs\
set outputConfig=.\..\..\..\services_app.config
set resourceFile=.\..\common\bin\Debug\common.dll
set svcTool="c:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\SvcUtil"

set wsdlPostFix=?WSDL
set commonParams=/noLogo /target:code /l:cs /ser:datacontractserializer /importxmltypes

 
set cmdLine=%commonParams% /r:%resourceFile% /config:%outputConfig% /d:%outputDir%

del %outputDir%%outputConfig%
del /Q %outputDir%\*.* 

set firstrun=true

for %%a in (%serviceList%) do (        
  echo Processing service: %%a       
  echo ------------------- 
  rem echo %svcTool% %cmdLine% %serviceHost%%%a%wsdlPostFix%
  
  if "!firstrun!" == "false" (  
    %svcTool% %cmdLine% /mergeConfig %serviceHost%%%a%wsdlPostFix%   
 )
    
  if "!firstrun!" == "true" (
     %svcTool% %cmdLine% %serviceHost%%%a%wsdlPostFix%     
     set firstrun=false
 )  
)

A szolgáltatásokat a serviceList listába kell felvenni, vesszővel elválasztva.
A /r: paraméter arra szolgál, hogy azon osztályok, amik szerepelnek a megadott dll-ben nem kerülnek legenerálásra a kliens oldalon.

Ha igazán széppé akarjuk tenni a megoldást, akkor kell írnunk egy alkalmazást, ami a végeredményül kapott services_app.config fájlt bele tudja illeszteni az app.config fájl megfelelő xpath helyére.

C# Singleton

Generics mint fogalom létezik a .net-ben. És ez jó. Gondoltam csinálok egy singleton ősosztályt mert az legalább olyan jó mint a generics.

   public abstract class Singleton<T> System.Object, new()
    {
        private static T _instance;

        public static T get()
        {
            if (_instance == null)
            {
                _instance=new T();
            }
            return _instance;
        }
    }

Öröm boldogság, gondoltam. De a fordító nem örült, és ezt mondta:

Error 1 Constraint cannot be special class ‘object’

Ejnye. Megnéztem a helpet.

Compiler Error CS0702
The following types may not be used as constraints: System.Array, System.Delegate, System.Enum, or System.ValueType.

Szerencsére, mint a Microsoft termékeknél általában, mindig van egy alternatív megoldás.

    public abstract class Singleton<T>
    {
        private static T _instance;

        public static T get()
        {
            if (_instance == null)
            {
                _instance = System.Activator.CreateInstance<T>();
            }
            return _instance;
        }
    }

Szolgáltatás és a Timer

Naivan azt gondolhatnánk, hogy ha egy Timer komponenst használunk a szolgáltatásunkban az működni fog. Pedig nem. A .Net rendelkezik pár Timer osztályal számunkra most kettő érdekes (az ismertetés csak felületes, akit érdekel nézze meg msdn-en ügyesen):
System.Threading.Timer: mint neve is mutatja külön szálat hoz létre, és az végzi az üzemezést
System.Windows.Forms.Timer: ezt használja a gui, azon keresztül történik az ütemezés
A feladat csak annyi, hogy amikor a szolgáltatásunk elindul, eldöntsük azt melyiket is kell használnunk. Célszerű erre egy burkoló osztályt létrehozni, ami a külső használók elöl elrejti, hogy milyen timer is működik a háttérben valójában.
Az én implementációm nagyon egyszerű, egy szempont volt: működjön. Letölthető itt.